深刻理解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