/**
* 读写锁:一个资源可以被多个读线程访问,也可以被多个写线程访问,但是不能同时存在读和写两个线程
* 读读可以共享,读写不能共存,写写不能共存,Synchronized和Lock都是可重入锁
* synchronized是一个关键字,由系统帮助我们释放锁,Lock是一个类,需要我们手动加锁
* 手动释放锁,如果忘记释放锁,线程会进入到死锁的状态,死锁的原因:资源分配不当,
* 资源不足,死锁的现象:多个线程,占据对方需要同步的资源,同时在等待对方,释放自己
* 需要同步的资源
*/
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
Lock readLock = readWriteLock.readLock();
Lock writeLock = readWriteLock.writeLock();
for (int i = 0; i < 5; i++) {
new Thread(() -> {
writeLock.lock();
try {
System.out.println(Thread.currentThread().getName()+"\t开始写数据");
try { TimeUnit.SECONDS.sleep(new Random().nextInt(5)); } catch(InterruptedException e) { e.printStackTrace(); }
System.out.println(Thread.currentThread().getName()+"\t写完数据");
} finally {
writeLock.unlock();
}
}, String.valueOf(i)).start();
}
for (int i = 0; i < 5; i++) {
new Thread(() -> {
readLock.lock();
try {
System.out.println(Thread.currentThread().getName()+"\t开始读数据");
try { TimeUnit.SECONDS.sleep(new Random().nextInt(5)); } catch(InterruptedException e) { e.printStackTrace(); }
System.out.println(Thread.currentThread().getName()+"\t读完数据");
} finally {
readLock.unlock();
}
}, String.valueOf(i)).start();
}