[Java并发编程之美]第2章 synchroized关键字
synchronized关键字
- synchronized块是Java提供的一种原子性内置锁,每个对象都可以把它当同步锁来用。线程在进入synchronized块钱会自动获取内部锁,这时候其他线程访问同步代码块时会被阻塞挂起。
- synchronized会造成很大的系统开销,尽量避免不必要的使用。
- 每种设置的锁对于一个对象(/锁加载静态方法和类上时是对于一个类的所有对象)锁只有一把。
synchronized关键字可以修饰以下这些
1 synchronized修饰一个方法
public class SingletonPattern {
public synchronized void method() {
//todo
}
}
- 若子类中覆盖了父类中synchronized修饰的方法,则默认是不继承synchronized,需要的话要显示的加synchronized。
2.1 synchronized修饰一个代码块
public void method() {
//other part
int num1;
int num2;
synchronized(this) {
//todo
}
}
- 当一个线程访问对象的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该对象中的非synchronized(this)同步的代码块。
2.2 synchronized修饰一个指定对象
public class SingletonPattern {
public void method(SomeObject obj) {
synchronized(obj) {
//todo
}
}
}
2.3 synchronized修饰一个特殊对象。只想同步代码块,没有明确要锁定的对象时,可以锁定一个特殊的对象
public class SingletonPattern {
private byte[] lock = new byte[0]; // 特殊的instance变量
public void method()
{
synchronized(lock) {
// todo 同步代码块
}
}
}
3 synchronized修饰静态方法
- 锁的是类,即类的所有对象共用一把锁。
4 synchronized修饰类
class ClassName {
public void method() {
synchronized(ClassName.class) {
// todo
}
}
}
- 同样,所有的类共用一把锁。
参考链接
https://blog.csdn.net/sinat_32588261/article/details/72880159
posted on 2019-07-29 22:19 coding_gaga 阅读(183) 评论(0) 编辑 收藏 举报