多线程之读写锁

/**
 * 读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由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();
  }
 }
}

猜你喜欢

转载自zw7534313.iteye.com/blog/2419676