一、Lock实现线程同步通信
1、Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象。两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象。
class Output{
//1、实例化一把锁,但Lock是个接口,要用ReentrantLock作为实现类
Lock lock = new ReentrantLock();
public void output1(String a){
int len = a.length();
lock.lock();//2、把所要锁起来的程序加锁
try {
for (int i = 0; i < len; i++) {
System.out.print(a.charAt(i));//打印每个字母
}
} finally {
lock.unlock(); //3、在finally里面打开锁
}
System.out.println();
}
}
2、读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁!
1)下面是jdk配的Demo
class CachedData {
Object data;
volatile boolean cacheValid;
final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();//读写锁实例
void processCachedData() {
rwl.readLock().lock(); //1、一开始假设有数据,上读锁
if (!cacheValid) {//判断是否有数据,有跳2、;没有跳4、
// Must release read lock before acquiring write lock
rwl.readLock().unlock(); //4、解读锁上写锁
rwl.writeLock().lock();
try {
// Recheck state because another thread might have
// acquired write lock and changed state before we did.
if (!cacheValid) {
data = ... //5、写数据
cacheValid = true;
}
// Downgrade by acquiring read lock before releasing write lock
rwl.readLock().lock(); //6、上读锁,解写锁
} finally {
rwl.writeLock().unlock(); // Unlock write, still hold read
}