首页 > 编程语言 > 详细

JAVA笔记15-线程同步

时间:2014-04-18 21:48:09      阅读:598      评论:0      收藏:0      [点我收藏+]

1、多个线程之间访问同一资源,进行协调的过程是线程同步。例如两个人同时操作同一银行账户。解决方法:加锁

2、Java种引入对象互斥锁的概念,保证共享数据操作的完整性。每个对象都对应于一个可称为“互斥锁”的标记,这个标记保证在任一时刻,只能有一个线程访问该对象。关键字synchronized来与对象的互斥锁联系。当某个对象synchronized修饰时,表明该对象在任一时刻只能有一个线程访问(错了吧??,应该说:某段代码或某个方法被synchronized修饰时,这段代码或这个方法在任一时刻只能有一个线程访问!)。

举例:bao

t1,t2两个线程同时访问同一个对象test。

bubuko.com,布布扣

结果:
bubuko.com,布布扣

应该是t1是第一个,t2是第二个才对。有错!

错误原因:一个线程的执行过程中,被另一个线程打断了。

解决方法一:锁住当前对象(对象的成员变量也必然锁定了),在20行加入synchoronized互斥锁

解决方法二:或者在19行加入同步方法,意思是执行该方法的过程中,当前对象被锁定。

bubuko.com,布布扣

注意调用sleep的线程不释放锁,但调用wait的线程释放锁。

3、死锁的模拟

bubuko.com,布布扣

bubuko.com,布布扣

死锁的条件(四个同时满足):互斥、部分锁定、循环等待、不可剥夺

解决方法:锁的粒度加粗(一次性锁定全部需要的资源,破坏部分锁定)

     规定顺序(破坏循环等待)

       可以剥夺(破坏不可剥夺)

4、synchronized面试题

(1)

bubuko.com,布布扣

问:上面程序中一个线程调用m1方法时,另一个线程可以同时调用m2方法吗?

答案:可以同时执行。main()函数运行输出1000,b=1000,说明可以同时执行两个方法。(如果输出100,b=1000则说明不可以)。如果将m2方法改为:

bubuko.com,布布扣

结果又是什么呢?答案:可以同时执行。输出2000,b=2000。

执行过程:m1修改b为1000,之后睡眠,m2修改b为2000,main中打印2000,m1睡眠结束打印b=2000。

注:那个方法加了synchronized只是说明该方法同时可以被一个线程调用,但是其他线程仍然可以自由调用非同步的方法(可能对同步方法产生影响,例如涉及到该同步方法中的变量)。

(2)正确做法:m1,m2都加同步

所以说,b相当于一个资源,如何控制该资源能够被正确访问呢?这就需要把涉及到该资源b的所有方法都考虑到!哪些方法是不是要设置为synchronized,所以本题中需要把m1,m2方法都加锁,即用synchronized修饰为同步方法。如下:

bubuko.com,布布扣

结果又是什么?答案:输出1000,b=1000

执行过程:m1,m2不能同时执行。运行m2方法,b的值改为2000,之后运行m1方法输出b改为1000,m1睡眠,main主线程输出1000,m1方法输出b=1000。

5、两个方法一个读该对象,另一个修改该对象的值。一般的情况下改的方法加锁(同步方法),因为不允许多个线程同时改;读的方法不加锁(非同步方法),因为可以同时读。所以是加只读锁。

 

 

 

      

JAVA笔记15-线程同步,布布扣,bubuko.com

JAVA笔记15-线程同步

原文:http://www.cnblogs.com/seven7seven/p/3670314.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!