深刻理解synchronized
(1)sychronized的字面意思是同步。他在java中的作用是保证多线程中数据的同步。
(2)你应该把synchronized理解为同步锁子。他的精髓是你锁定的对象是什么。
根据锁定的对象的不同大概有这样几种用法:
<1> 锁定类:
第一种情况:
public class Test{
public void method(){
synchronized(Test.class){
// 需要同步的代码
}
}
}
第二种情况:
public class Test{
public synchronized static void method(){
// 需要同步的代码
}
}
这两种情况的效果是一样的同步的都是本类,也就是说同一时间,不同线程中,
只有一个地方获得了本类的锁,在执行其中的一个类同步代码部分。
<2> 锁定类的实例。
第一种情况:
public class Test{
public synchronized void method(){
// 需要同步的代码
}
}
第二种情况:
public class Test{
public void method(){
synchronized(this){
// 需要同步的代码
}
}
}
这两种情况的效果是一样的同步的都是本类,也就是说同一时间,不同线程中,
只有一个地方获得了本类的实例的锁,在执行其中的某个类的同一个实例的同步代码部分。
第三种情况:
public class Test{
byte[] lock = new byte[0];
public void method(){
synchronized(lock){
// 同步的代码
}
}
}
本质上这三种情况是一样的都是获得的对象的实例的锁。
参考:(1)http://blog.youkuaiyun.com/yaerfeng/article/details/7254734
(2)http://my.oschina.net/20076678/blog/173166
(1)sychronized的字面意思是同步。他在java中的作用是保证多线程中数据的同步。
(2)你应该把synchronized理解为同步锁子。他的精髓是你锁定的对象是什么。
根据锁定的对象的不同大概有这样几种用法:
<1> 锁定类:
第一种情况:
public class Test{
public void method(){
synchronized(Test.class){
// 需要同步的代码
}
}
}
第二种情况:
public class Test{
public synchronized static void method(){
// 需要同步的代码
}
}
这两种情况的效果是一样的同步的都是本类,也就是说同一时间,不同线程中,
只有一个地方获得了本类的锁,在执行其中的一个类同步代码部分。
<2> 锁定类的实例。
第一种情况:
public class Test{
public synchronized void method(){
// 需要同步的代码
}
}
第二种情况:
public class Test{
public void method(){
synchronized(this){
// 需要同步的代码
}
}
}
这两种情况的效果是一样的同步的都是本类,也就是说同一时间,不同线程中,
只有一个地方获得了本类的实例的锁,在执行其中的某个类的同一个实例的同步代码部分。
第三种情况:
public class Test{
byte[] lock = new byte[0];
public void method(){
synchronized(lock){
// 同步的代码
}
}
}
本质上这三种情况是一样的都是获得的对象的实例的锁。
参考:(1)http://blog.youkuaiyun.com/yaerfeng/article/details/7254734
(2)http://my.oschina.net/20076678/blog/173166
深入解析synchronized
本文详细介绍了Java中的synchronized关键字,包括其作为同步锁的作用及多种使用方式,如锁定类、锁定类实例等,并通过示例代码说明不同应用场景。
986

被折叠的 条评论
为什么被折叠?



