第二章 synchronized与锁
前言
Java 多线程环境下,多个线程同时访问共享资源时可能出现的数据竞争和不一致的情况
为了解决线程安全问题,Java提供了很多方式:
synchronized
关键字、lock
锁等- 线程安全的数据结构,如:
ConcurrentHashMap
、ConcurrentLinkedQueue
等 volatile
关键字
1、Synchronized
-
修饰方法
- 修饰普通方法:相当于锁当前实例,调用者,即指
this
对象
public synchronized void instanceLock() { // code }
- 修饰静态方法:相当于锁当前
Class
类对象,指className.class
public static synchronized void classLock() { // code }
- 修饰普通方法:相当于锁当前实例,调用者,即指
-
修饰代码块(可缩小
锁
的范围,提升性能)- 锁括弧里的
this
public void blockLock() { synchronized (this) { // code } }
- 锁类对象
className.class
public void blockLock() { synchronized (this.getClass()) { // code } }
观上述代码可知:锁普通方法
等价
于锁括弧里的this
写法 ,锁静态方法等价
锁类对象的写法2、锁未完待续…
- 锁括弧里的
总结:
多线程并发访问共享资源时,使用synchronized关键字可以有效地避免数据竞争和不一致的情况,保证程序的正确性和稳定性。