实现线程同步的方法
- 对代码块加
synchronized (obj)
关键字 - 对方法加
synchronized (this)
关键字 - 对类加
synchronized (Class.class)
关键字 - 使用线程安全(同步安全)的类:
Hashtable
Vector
Stringbuffer
- 使用 Collections 中的 synchronizedList 等方法:
Collections.synchronizedList(new ArrayList())
- 对代码块使用
Lock
Lock 接口的实现类实现资源上锁
- Lock 本身是个接口,因此不能直接进行创建
- 一般使用它的实现类 ReentrantLock 进行实现
void lock()
:获得锁void unlock()
:释放锁- 加锁和解锁不需要和
synchronized
关键字一样需要object
- 但是这种加锁方式存在缺陷,如果上锁的代码出现了问题,无法释放锁,那么其他的线程就一直不能访问这个部分,因此规范的加锁方式如下:
- 使用
try...finally
结构,把解锁的过程放在finally
中进行执行,这样无论如何最后都会进行解锁