1. synchronized
被synchronized修饰的对象叫做同步监视器,多个线程进入被synchronized修饰的方法或代码块时,需要获得对同步监视器的锁定,同一时刻只有一个线程能够获得对同步监视器的锁定,据此实现线程同步机制。对于synchronized同步监视器的解锁下面有单独说明。
1. synchronized 用法
1. 修饰方法
public synchronized void test(){
....
}
此时默认this作为同步监视器
2. 修饰同步代码块
synchronized(lock){
}
此时显示指定lock对象作为同步监视器
2. 释放同步监视器的几种情况
1. 同步方法或同步代码块执行完毕
2. 同步方法或同步代码块return或break
3. 异常退出
4. wait
3. 线程同步
调用同步监视器的wait,notify和notifyAll方法
2. lock
1. 使用ReentrantLock
ReentrantLock lock = new ReentrantLock();
lock.lock();
try{
...
}finally{
lock.unlock();
}
2. 线程通信,使用lock加锁解锁需要使用condition进行控制
ReentrantLock lock = new ReentrantLock();
Condition cond = lock.newCondition();
cond.await()
cond.signal()
cond.signalAll()
以上三个方法与wait、notify和notifyAll比较类似
3. 阻塞队列BlockingQueue
利用BlockingQueue阻塞队列的put和take方法的线程阻塞实现线程控制