- 加锁后必须解锁
Lock lock=new ReentrantLock();
lock.lock();
try {
//do something
} catch (Exception e) {
//回滚try中的操作或者改成合适的状态值
e.printStackTrace();
}finally {
lock.unlock();
}
- 带有条件的加锁,条件的await操作一般放在while代码块里面
while (条件){
//do something
try {
condition.await();
} catch (InterruptedException exception) {
exception.printStackTrace();
}
//await结束后继续进去循环 判断一次条件是否满足
}
Lock lock = new ReentrantLock();
Condition emptyCondition = lock.newCondition();
Condition notEmptyCondition = lock.newCondition();
List<String> list = new ArrayList<>();
//一个(组)线程负责取数据
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
lock.lock();
try {
while (list.isEmpty()) {
notEmptyCondition.signalAll();
emptyCondition.await();
}
String s = list.get(0);
System.out.println(s);
list.remove(0);
try {
Thread.sleep(1000);
}catch ( InterruptedException exception){
exception.printStackTrace();
}
} catch (Exception e) {
//回滚try中的操作或者改成合适的状态值
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
});
t1.start();
//一个(组)线程负责存放数据
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
lock.lock();
try {
while (!list.isEmpty()) {
emptyCondition.signalAll();
notEmptyCondition.await();
}
list.add(LocalDateTime.now().toString());
} catch (Exception e) {
//回滚try中的操作或者改成合适的状态值
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
});
t2.start();