Java中读写锁

傷城~ 2023-06-07 03:16 79阅读 0赞

1.读写操作必须共用一个锁对象

读线程

  1. public class ReadLock implements Runnable {
  2. // 获取一个key对应的value
  3. public void get(String key) {
  4. ReentrantReadWriteLock.ReadLock readLock = WriteLock.rwl.readLock();
  5. readLock.lock();
  6. try {
  7. //为了演示出效果,get操作再细分如下,开始—>结束视为原子步骤
  8. System.out.println("正在做读的操作,key:" + key + " 开始");
  9. Thread.sleep(1000);
  10. System.out.println("正在做读的操作,key:" + key + " 结束");
  11. } catch (InterruptedException e) {
  12. e.printStackTrace();
  13. } finally {
  14. readLock.unlock();
  15. }
  16. }
  17. @Override
  18. public void run() {
  19. for (int key = 0; key < 5; key++) {
  20. get("" + key);
  21. }
  22. }
  23. }

2.写线程

  1. public class WriteLock implements Runnable {
  2. public static final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();//读写锁对象,两者必须共用一个锁对象
  3. // 获取一个key对应的value
  4. public void put(String key) {
  5. ReentrantReadWriteLock.WriteLock writeLock =rwl.writeLock();
  6. try {
  7. writeLock.lock();
  8. System.out.println("正在做写的操作,key:" + key + ",value:" + "开始.");
  9. Thread.sleep(1000);
  10. System.out.println("正在做写的操作,key:" + key + ",value:" + "结束.");
  11. System.out.println();
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. } finally {
  15. writeLock.unlock();
  16. }
  17. }
  18. @Override
  19. public void run() {
  20. for (int key = 0; key < 5; key++) {
  21. put("" + key);
  22. }
  23. }
  24. }

3.测试

  1. public class LockTest {
  2. public static void main(String[] args) {
  3. ReadLock readLock=new ReadLock(); //读
  4. WriteLock writeLock=new WriteLock(); //写
  5. Thread thread1=new Thread(readLock); //读线程
  6. Thread thread2=new Thread(readLock); //读线程
  7. Thread thread3=new Thread(writeLock);//写线程
  8. thread1.start();//启动读
  9. thread2.start();//启动读
  10. thread3.start();//启动写
  11. }
  12. }

4.结果

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5nc2hlbmdxaWFuZzE2OA_size_16_color_FFFFFF_t_70

在做写操作的时候无法进行读操作,读读操作不影响,是一并执行的,但是读操作也是必须要加读锁的,不能省略,不然也会乱

发表评论

表情:
评论列表 (有 0 条评论,79人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java

    使用读写锁要兼顾性能和安全性 对于共享数据来说,如果说某个方法在访问它的时候,只是去读取,并不更新数据,那是不是就不需要加锁呢?还是需要的,因为如果一个线程读数据的同时,另外