Java多线程Day04-多线程之synchronized关键字
原创
©著作权归作者所有:来自51CTO博客作者攻城狮Chova的原创作品,请联系作者获取转载授权,否则将追究法律责任
synchronized原理
- Java中,每个对象有且仅有一个同步锁.即同步锁是依赖对象而存在的
- 调用某个对象的synchronized方法时,就获取了该对象的同步锁
-
不同线程之间对同步锁的访问是互斥的:
- 某个时间点,对象的同步锁只能被一个线程获取
- 通过使用同步锁,就可以在多线程中,实现对象或者方法的互斥访问
synchronized基本规则
-
第一条: 当一个线程访问某对象的synchronized方法或者synchronized代码块时,其余线程对该对象的该synchronized方法或者该synchronized代码块的访问将被阻塞
-
第二条: 当一个线程访问某对象的synchronized方法或者synchronized代码块时,其余线程可以访问该对象的非同步代码块
-
第三条: 当一个线程访问某对象的synchronized方法或者synchronized代码块时,其余线程对该对象的其余synchronized方法或者其余synchronized代码块的访问将被阻塞
synchronized方法
- 用synchronized修饰的方法叫作synchronized方法
public synchronized void runs() {
...
}
synchronized代码块
- 用synchronized修饰的代码块叫作synchronized代码块
public void runs() {
synchronized (this) {
...
}
}
-
synchronized代码块中的this指代当前对象,即获取当前对象的同步锁. 也可以换成其余对象
-
synchronized代码块可以更精确控制冲突访问区域,使用效率更高
全局锁
-
全局锁:
- 全局锁是指类的锁
- 无论实例化多少个对象,线程都共享该锁
- 全局锁对象的就是static synchronized. 或者是锁在该类的class或者classloader对象上
实例锁
-
实例锁:
- 锁在一个实例对象上面
- 如果该类是单例,那么该锁也具有全局锁的概念
- 实例锁对应的就是synchronized关键字