Synchronized的使用和注意事项
2018-06-24 10:40
134 查看
synchronized:
1、取得的锁都是对象锁,而不是把一段代码或方法(函数)当作锁;
2、多个线程访问的必须是同一个对象。
3、当一个线程执行的代码出现异常时,其所持有的锁会自动释放
4、A线程持有Object对象的Lock锁,B线程可以以异步方式调用Object对象中的非synchronized类型的方法
5、A线程持有Object对象的Lock锁,B线程如果在这时调用Object对象中的synchronized类型的方法则需要等待,也就是同步
6、当一个线程得到一个对象锁后,再次请求此对象锁时时可以再次得到该对象的锁的;
代码块:
1、A线程访问对象的synchronize代码块时,B线程依然可以访问对象的非synchronize代码块;
2、A线程访问对象的synchronize代码块时,B线程依然可以访问对象的synchronize代码块将会被阻塞;
3、线程A访问对象调用synchronize代码块时,线程B访问对象的synchronize方法时,将获取线程A的对象锁;
4、"任意对象"作为对象监视器来实现同步的功能。这个"任意对象"大多数是实例变量及方法的参数,全局实例变量,synchronized(非this),
不用阻塞每一个代码块,有效提高效率。
静态同步方法是类锁,非静态同步方法时对象锁,独立执行。
1、局部变量每调用一次方法其值都在当前线程的当前栈中临时分配;
2、也就是说对程序,同一时刻,只可能有一块栈内存被当前方法使用,用完了就回收了;
3、所以多线程并发访问一个只用到局部变量的方法是不用考虑并发安全性的。
synchronized (object)与synchronized (this)一样,获取实例对象的锁.
因为synchronized (this)只能获取当前实例锁,那么synchronized (object)就是可以获取其他实例锁的意思
对于synchronized 最简单粗暴的理解就是,你要哪些线程方法同步,就跟他们获取一样的锁好了,A.class,就获取A.class,
objectA 就获取 objectA(我说的不是对象名相同,而是真真切切在java堆中的同一个对象),
synchronized与static synchronized 的区别
synchronized是对类的当前实例(当前对象)进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块
static synchronized恰好就是要控制类的所有实例的并发访问
1、取得的锁都是对象锁,而不是把一段代码或方法(函数)当作锁;
2、多个线程访问的必须是同一个对象。
3、当一个线程执行的代码出现异常时,其所持有的锁会自动释放
4、A线程持有Object对象的Lock锁,B线程可以以异步方式调用Object对象中的非synchronized类型的方法
5、A线程持有Object对象的Lock锁,B线程如果在这时调用Object对象中的synchronized类型的方法则需要等待,也就是同步
6、当一个线程得到一个对象锁后,再次请求此对象锁时时可以再次得到该对象的锁的;
代码块:
1、A线程访问对象的synchronize代码块时,B线程依然可以访问对象的非synchronize代码块;
2、A线程访问对象的synchronize代码块时,B线程依然可以访问对象的synchronize代码块将会被阻塞;
3、线程A访问对象调用synchronize代码块时,线程B访问对象的synchronize方法时,将获取线程A的对象锁;
4、"任意对象"作为对象监视器来实现同步的功能。这个"任意对象"大多数是实例变量及方法的参数,全局实例变量,synchronized(非this),
不用阻塞每一个代码块,有效提高效率。
静态同步方法是类锁,非静态同步方法时对象锁,独立执行。
1、局部变量每调用一次方法其值都在当前线程的当前栈中临时分配;
2、也就是说对程序,同一时刻,只可能有一块栈内存被当前方法使用,用完了就回收了;
3、所以多线程并发访问一个只用到局部变量的方法是不用考虑并发安全性的。
synchronized (object)与synchronized (this)一样,获取实例对象的锁.
因为synchronized (this)只能获取当前实例锁,那么synchronized (object)就是可以获取其他实例锁的意思
对于synchronized 最简单粗暴的理解就是,你要哪些线程方法同步,就跟他们获取一样的锁好了,A.class,就获取A.class,
objectA 就获取 objectA(我说的不是对象名相同,而是真真切切在java堆中的同一个对象),
synchronized与static synchronized 的区别
synchronized是对类的当前实例(当前对象)进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块
static synchronized恰好就是要控制类的所有实例的并发访问
相关文章推荐
- lock与synchronized使用中的注意事项(持续补充)
- coordinatorLayout使用详解及注意事项,看完这篇完全可以开发5.0的高级特效了
- libcurl 使用的几个注意事项
- vc中使用ace的注意事项
- Qt中如何禁掉所有UI操作以及注意事项(处理各个widget的eventFilter这一层,但是感觉不好,为什么不使用QApplication呢)
- C# 多线程使用队列注意事项
- MapGuide使用Oracle Spatial中的表建立图层注意事项
- ssm(struts2、spring、ibatis)框架使用注意事项
- 使用OpenSSL工具制作X.509证书的方法及其注意事项总结
- 多行宏定义使用注意事项
- Mysql使用sum函数时的注意事项
- Log4j 2.x使用注意事项
- NPOI的RemoveSheetAt()方法使用注意事项
- PHP中$_FILES的使用及注意事项
- c3p0的使用方法及注意事项
- This Handler class should be static or leaks might occur,Handler和Context使用的注意事项!
- LigerUI使用的一些注意事项
- coordinatorLayout使用详解及注意事项,看完这篇完全可以开发5.0的高级特效了
- 关于block使用的5点注意事项
- 使用strcpy的注意事项