多线程之读写锁

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设有一个共享数据结构(例如一个数组或列表),多个线程需要同时对其进行取和修改操作。这时候就可以使用读写锁来控制对共享数据的访问。 读写锁分为两种类型,多个线程可以同时持有进行取操作,但只有一个线程可以持有进行修改操作。当有线程持有时,其他线程无法持有。这样可以避免多个线程同时修改数据导致的竞争条件问题。 下面是一个使用读写锁的示例代码: ```python import threading class SharedData: def __init__(self): self.data = [] self.rwlock = threading.RWLock() def read_data(self): with self.rwlock.read_lock(): print("Reading data...") # 取共享数据 def write_data(self): with self.rwlock.write_lock(): print("Writing data...") # 修改共享数据 ``` 在上面的示例中,我们创建了一个名为 `SharedData` 的类,它包含一个数组和一个读写锁。类中定义了两个方法 `read_data` 和 `write_data`,分别用于取和修改共享数据。 在取数据时,我们使用 `with self.rwlock.read_lock():` 来获取,这样可以保证多个线程可以同时进行取操作。 在修改数据时,我们使用 `with self.rwlock.write_lock():` 来获取,这样只有一个线程可以进行修改操作,避免了竞争条件问题。 使用读写锁可以提高多线程程序的效率和安全性,避免了竞争条件问题和死问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值