一、修饰方法
1.修饰普通方法:对调用此方法的对象加锁
2.修饰static方法:对调用此方法的类的所有对象加锁
3.不能修饰构造方法,但是可以在构造方法内部修饰代码块
二、修饰代码块
1.synchronized(this):相当于修饰普通方法
2.synchronized(A.class):相当于修饰static方法
3.synchronized(实例变量):给调用此方法的对象的实例变量加锁
例子:
public class A{
private byte[] s=new byte[0];
public void doSth(){
synchronized(s){
...
}
}
}
4.synchronized(类变量):给调用此方法的类的所有对象的类变量加锁
例子:
public class A{
private static byte[] s=new byte[0];
public void doSth(){
synchronized(s){
...
}
}
}
5.synchronized(对象):明确给某个指定对象加锁
例子:
public class A{
public void doSth(Object obj){
synchronized(obj){
...
}
}
}
6.synchronized代码块不能修饰基本数据类型的变量
7.synchronized代码块修饰基本数据类型的包装类时,如果在同步块中对同步变量进行运算会导致同步失效,
因为内部包含了封箱拆箱动作,包装类引用指向了新的对象
8.synchronized代码块修饰String变量时,如果在同步块中对String变量重新赋值会导致同步失效,
因为创建String的实例并不需要new,String变量在重新赋值时引用指向了新的对象
1.修饰普通方法:对调用此方法的对象加锁
2.修饰static方法:对调用此方法的类的所有对象加锁
3.不能修饰构造方法,但是可以在构造方法内部修饰代码块
二、修饰代码块
1.synchronized(this):相当于修饰普通方法
2.synchronized(A.class):相当于修饰static方法
3.synchronized(实例变量):给调用此方法的对象的实例变量加锁
例子:
public class A{
private byte[] s=new byte[0];
public void doSth(){
synchronized(s){
...
}
}
}
4.synchronized(类变量):给调用此方法的类的所有对象的类变量加锁
例子:
public class A{
private static byte[] s=new byte[0];
public void doSth(){
synchronized(s){
...
}
}
}
5.synchronized(对象):明确给某个指定对象加锁
例子:
public class A{
public void doSth(Object obj){
synchronized(obj){
...
}
}
}
6.synchronized代码块不能修饰基本数据类型的变量
7.synchronized代码块修饰基本数据类型的包装类时,如果在同步块中对同步变量进行运算会导致同步失效,
因为内部包含了封箱拆箱动作,包装类引用指向了新的对象
8.synchronized代码块修饰String变量时,如果在同步块中对String变量重新赋值会导致同步失效,
因为创建String的实例并不需要new,String变量在重新赋值时引用指向了新的对象
三、synchronized不能被继承