为什么会有线程同步的概念呢?为什么要同步?什么是线程同步?先看一段代码:

package com.maso.test;

public class ThreadTest2 implements Runnable{

private TestObj testObj = new TestObj();

public static void main(String[] args) {

ThreadTest2 tt = new ThreadTest2();

Thread t1 = new Thread(tt, "thread_1");

Thread t2 = new Thread(tt, "thread_2");

t1.start();

t2.start();

}

@Override

public void run() {

for(int j = 0; j < 10; j++){

int i = fix(1);

try {

Thread.sleep(1);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + " : i = " + i);

}

}

public int fix(int y){

return testObj.fix(y);

}

public class TestObj{

int x = 10;

public int fix(int y){

return x = x - y;

}

}

}输出结果后,就会发现变量x被两个线程同时操作,这样就很容易导致误操作。如何才能解决这个问题呢?用线程的同步技术,加上synchronized关键字

public synchronized int fix(int y){

return testObj.fix(y);

}加上同步后,就可以看到有序的从9输出到-10.

如果加到TestObj类的fix方法上能不能实现同步呢?

public class TestObj{

int x = 10;

public synchronized int fix(int y){

return x = x - y;

}

}如果将synchronized加到方法上则等价于

synchronized(this){

}可以判断出两个线程使用的TestObj类的同一个实例testOjb,所以后实现同步,但是输出的结果却不是理想的结果。这是因为当A线程执行完x = x - y后还没有输出则B线程已经进入开始执行x = x - y.

所以像下面这样输出就不会有什么问题了:

public class TestObj{

public TestObj(){

System.out.println("调用了构造函数");

}

int x = 10;

public synchronized int fix(int y){

x = x - y;

System.out.println(Thread.currentThread().getName() + " : x = " + x);

return x;

}

}如果将外部的fix方法修改如下:

public int fix(int y){

ax++ ;

if(ax%2 == 0){

return testObj.fix(y, testObj.str1);

}else{

return testObj.fix(y, testObj.str2);

}

}

public class TestObj{

String str1 = "a1";

String str2 = "a2";

public TestObj(){

System.out.println("调用了构造函数");

}

int x = 10;

public int fix(int y, String str){

synchronized (str) {

x = x - y;

System.out.println(Thread.currentThread().getName() + " : x = " + x);

}

return x;

}

}此时synchronized中的str对象不是同一个对象,所以两个线程所持有的对象锁不是同一个,这样就不能实现同步。要实现线程之间的互斥就要使用同一个对象锁。

什么是死锁呢?举个例子就是比如你和同学租了个两室的房子,你拿着你房子的钥匙,你同学拿着他房子的钥匙,现在你在房子等你同学将他的钥匙给你然后你进他房子,你同学在他的房子等你将钥匙给他然后他进你的房子,这样就死锁了。

package com.maso.test;

public class ThreadDieSock implements Runnable {

private int flag = 1;

private Object obj1 = new Object(), obj2 = new Object();

public void run() {

System.out.println("flag=" + flag);

if (flag == 1) {

synchronized (obj1) {

System.out.println("我已经锁定obj1,休息0.5秒后锁定obj2去!");

try {

Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (obj2) {

System.out.println("1");

}

}

}

if (flag == 0) {

synchronized (obj2) {

System.out.println("我已经锁定obj2,休息0.5秒后锁定obj1去!");

try {

Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (obj1) {

System.out.println("0");

}

}

}

}

public static void main(String[] args) {

ThreadDieSock run01 = new ThreadDieSock();

ThreadDieSock run02 = new ThreadDieSock();

run01.flag = 1;

run02.flag = 0;

Thread thread01 = new Thread(run01);

Thread thread02 = new Thread(run02);

System.out.println("线程开始喽!");

thread01.start();

thread02.start();

}

}

Android 同步锁死锁,Android多线程研究(3)——线程同步和互斥及死锁相关推荐

  1. Android SQLite多线程读写和线程同步源码分析

    没啥诀窍,只需保证几个线程都是用的一个SQLiteDataBase对象就行了. 如果我们非要在不同线程中用两个或更多的SQLiteDataBase对象呢,当然这些SQLiteDataBase对象所操作 ...

  2. 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)

    多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上) 转自 http://www.cnblogs.com/freshman0216/archive/2008/07/27/ ...

  3. 7.生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信)...

    1 /* 2 * 生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信) 3 * */ 4 public class TestProductorAndConsum ...

  4. 多线程怎么保证数据安全_Python threading实现多线程 提高篇 线程同步,以及各种锁...

    本文主要讲多线程的线程之间的资源共享怎么保持同步. 多线程基础篇见,木头人:Python threading实现多线程 基础篇 Python的多线程,只有用于I/O密集型程序时效率才会有明显的提高,如 ...

  5. VC++中多线程学习(MFC多线程)三(线程同步包含:原子互锁、关键代码段、互斥器Mutex、Semaphores(信号量)、Event Objects(事件))

    目录 ​​​​​​​​​​​​ 线程同步的必要性: 2.解决同步问题的方法 2.1原子互锁家族函数 2.2Critical Sections(关键代码段.关键区域.临界区域) 2.3 互斥器Mutex ...

  6. java多线程同步与死锁,廖雪峰Java11多线程编程-2线程同步-3死锁

    在多线程编程中,要执行synchronized块,必须首先获得指定对象的锁. 1.Java的线程锁是可重入的锁 public void add(int m){ synchronized (lock){ ...

  7. 多线程编程、线程同步|安全和线程通信

    多线程编程 多线程的优势 线程在程序中是独立的.并发的执行流,与分隔的进程相比,进程中的线程之间的隔离程度要小.他们共享内存.文件句柄和其他每个进程应有的状态. 因为线程的划分尺度小于进程,使得多线程 ...

  8. 【记录】python多线程的使用 线程同步(LOCK和RLOCK) python与mysql数据库交互实现增加和查找 python的格式化输出

    文章目录 多线程: _thread模块 threading模块: 线程同步(LOCK和RLOCK) 和mysql交互: 附:python的格式化输出 附录 多线程: _thread模块 例一 impo ...

  9. 细说C#多线程那些事 - 线程同步和多线程优先级

    上个文章分享了一些多线程的一些基础的知识,今天我们继续学习. 一.Task类 上次我们说了线程池,线程池的QueueUserWorkItem()方法发起一次异步的线程执行很简单 但是该方法最大的问题是 ...

  10. Win32多线程编程(3) — 线程同步与通信

    一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线程的 ...

最新文章

  1. X射线图像中的目标检测
  2. 网页设计简约_简约设计指南
  3. 使用python和pandas进行同类群组分析
  4. mysql技术内幕sampdb_MySql技术内幕之MySQL入门(1)
  5. 晋升,结婚,出书,买房,这就是我的2019年!
  6. fastjson 添加key value_FastJson迁移至Jackson
  7. 从安装到部署的Cordova iOS应用开发说明
  8. 教你用Python自制拼图小游戏,轻松搞定熊孩子
  9. JS正则验证邮箱的格式
  10. 计算机二级是报office还是vb,请问一下计算机二级中,高阶office好考,还是VB好考?...
  11. 两种解决Qt5显示中文乱码的方法(使用QStringLiteral和#pragma execution_character_set(utf-8)两种方法)
  12. MAC刻录iso到USB、U盘
  13. vue结合高德地图V2.0(JSAPI key搭配代理服务器并携带安全密钥转发)
  14. Unity3D插件之FingerGestures:手势插件
  15. 生日快乐程序_时光匆匆,爱你不变——祝星广十七岁生日快乐
  16. linux驱动面试题目汇总
  17. 蘑菇街Java后台开发一二面面经
  18. jupyter notebook ModuleNotFoundError: No module named ‘tensorflow‘---爬出坑
  19. Python学记(三)turtle库
  20. macos安装urar具体步骤_U盘安装MAC OS 系统步骤

热门文章

  1. MacOS下IDEA设置智能提示不区分大小写
  2. Android应用安装apk版本升级,适配Android 8.0和Android 10.0下载安装,shell命令安装APK
  3. Android 设置view透明度,广告标题透明背景
  4. jmeter测试TCP服务器/模拟发送TCP请求
  5. 软件测试个人心得总结
  6. java kafka 集群消费_kafka集群简单生产者消费者实例
  7. React Native windows环境安装遇到的坑
  8. oracle虑重语句,db基本语句(oracle)
  9. 实验14:访问CMOS RAM显示当前日期和时间
  10. spark on yarn webUI logs不能查看