码迷,mamicode.com
首页 > 其他好文 > 详细

一.对象及变量的并发访问

时间:2017-10-18 19:41:18      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:操作   共享资源   自动   线程   logs   images   参数   异常   排队   

章主要介绍Java多线程中的同步,也就是如何在java语言中写出线程安全的程序。

synchronized同步方法

  非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”。

方法内的变量为线程安全

  “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全问题”,所得的结果也就是线程安全了。

 技术分享

技术分享

 

技术分享

 

技术分享

 方法中的变量不存在非线程安全问题,永远都是线程安全的。这是方法内部变量是私有的性质决定的。

实例变量非线程安全

如果多个线程共同访问一个对象中的实例变量,则有可能出现“非线程安全”问题。

多个对象多个锁

技术分享

技术分享

技术分享

 

 技术分享

 

 

上面的例子是两个线程分别访问同一个类的两个不同实例的相同名称的同步方法。效果却是以异步的方式运行的。

本示例由于创建了2个业务对象,在系统中产生了2个锁,所以运行的结果是异步的,打印的效果就是先打印b,然后打印a。

技术分享

也是说同步方法的锁就是该对象实例。

 

synchronized方法和锁对象

调用关键字synchronized声明的方法一定是排队运行的。另外需要牢记“共享”两个字。只有共享资源的读写访问才需要同步化,如果

不是共享资源,那么根本没有同步的必要。

技术分享

 

脏读

技术分享

技术分享

synchronized锁重入

 技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

出现异常,锁自动释放

当一个线程执行的代码出现异常时,其所持有的锁会自动释放。

同步不具有继承性

技术分享

synchronized同步代码块技术分享

synchronized同步代码块

当一个线程访问object的一个synchronized同步代码块时,另一个线程仍然可以访问该object对象中的非同步代码块。

验证同步synchronized(this)代码块时锁定当前对象的

和synchronized方法一样,synchronized(this)代码块也是锁定当前的对象的。

技术分享

 

 技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

 

 将任意对象作为对象监视器

技术分享

这个任意对象大多数是实例对象或方法参数。

技术分享

技术分享

技术分享

使用“synchronized(非this对象)”同步代码块格式进行同步操作时,对象监视器必须是同一个对象。如果不是同一个对象监视器,运行的结果就是异步了。

 

细化三个结论

技术分享

静态同步synchronized方法与synchronized(class)代码块

  关键字synchronized还可以应用在static静态方法上,如果这样写,那就是对当前的。*.jave文件对应的Class类进行持锁,测试项目在synStaticMethod中.

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

 

一.对象及变量的并发访问

标签:操作   共享资源   自动   线程   logs   images   参数   异常   排队   

原文地址:http://www.cnblogs.com/duan2/p/7610942.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!