J.U.C包学习 from 廖雪峰老师的Java教程
锁
ReentrantLock(re entrant lock, 可重入锁)
作用
替代synchronized,更安全、更灵活
使用
class Counter {
private final Lock lock = new ReentrantLock();
private int count;
public void add() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
}
- 要同步的对象(Counter)中创建字段
- 有同步操作的方法(add), 不加synchronized了,而是方法中用下面的格式(lock-try-do something-finally-unlock)
Condition(替代wait和notify)
class TaskQueue {
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
private Queue<String> queue = new LinkedList<>();
public void addTask(String s) {
lock.lock();
try {
queue.add(s);
condition.signalAll();
} finally {
lock.unlock();
}
}
public String getTask() {
lock.lock();
try {
while(queue.isEmpty()){
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return queue.remove();
} finally {
lock.unlock();
}
}
}