/**
* 读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,
* 我们只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,
* 那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。
* 总之,读的时候上读锁,写的时候上写锁!
*
* ReentrantReadWriteLock--顾名思义是可重入的读写锁,
* 允许多个读线程获得ReadLock,但只允许一个写线程获得WriteLock
*
* 读写锁一种先进的线程锁机制。允许多个线程在同一时间对某特定资源进行读取,
* 但同一时间内只能有一个线程对其进行写入。
*/
public class ReadWriteLockTest {
private User user = new User();
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public static void main(String[] args) {
ReadWriteLockTest o = new ReadWriteLockTest();
o.user.setName("w");
o.user.setDesc("w");
for(int i=0;i<50;i++) {
o.new Read().start();
o.new Write().start();
}
}
class User{
private String name;
private String desc;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
class Read extends Thread{
public void run() {
lock.readLock().lock(); //获取值用读锁
System.out.println(user.getName() + ","+user.getDesc());
lock.readLock().unlock();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Write extends Thread{
public void run() {
lock.writeLock().lock(); //设值用写锁
String name = new Random().nextInt(100) + "";
user.setName(name);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
user.setDesc(name);
lock.writeLock().unlock();
}
}
}