Java并发系列4

今天讲另一个并发工具,叫读写锁。读写锁是一种分离锁,是锁应用中的一种优化手段。
考虑读多写少的情况,这时如果我们用synchronized或ReentrantLock直接修饰读/写方法未尝不可,如:

1 public static class Rw { 2 private int val; 3 4 public synchronized int read() throws InterruptedException { 5 Thread.sleep(1000); 6 return val; 7 } 8 9 public synchronized void write(int value) throws InterruptedException { 10 Thread.sleep(1000); 11 this.val = value; 12 } 13 }

简单有效。
如果我们想做点优化的话(前面说了读的情况比较多),也许要用到读写锁ReadWriteLock了`。
先看代码:

1 public static class Rw { 2 private int val; 3 4 public int read(Lock lock) throws InterruptedException { 5 try { 6 lock.lock(); 7 Thread.sleep(1000); 8 return val; 9 } finally { 10 lock.unlock(); 11 } 12 } 13 14 public void write(Lock lock, int value) throws InterruptedException { 15 try { 16 lock.lock(); 17 Thread.sleep(1000); 18 this.val = value; 19 } finally { 20 lock.unlock(); 21 } 22 } 23 }

调用:

1 private static ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); 2 3 public static void main(String[] args) { 4 final Rw rw = new Rw(); 5 6 for (int i = 18; i < 20; i++) { 7 new Thread(() -> { 8 try { 9 rw.write(readWriteLock.writeLock(),1); 10 } catch (InterruptedException e) { 11 e.printStackTrace(); 12 } 13 }).start(); 14 } 15 for (int i = 0; i < 18; i++) { 16 new Thread(() -> { 17 try { 18 int read = rw.read(readWriteLock.readLock()); 19 System.out.println(read); 20 } catch (InterruptedException e) { 21 e.printStackTrace(); 22 } 23 }).start(); 24 } 25 }

ReentrantReadWriteLockReadWriteLock的常用子类。
代码逻辑比较简单,读的时候上读锁,写的时候上写锁。只有写的时候会阻塞等待,所以代码大概2秒钟执行结束。
这里面只需要注意一个问题:所有和写相关的都会阻塞,比如读-写同时进行,也会阻塞。

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

mysql 锁

第一章概述锁的分类:从对数据操作的粒度分表锁、行锁。从对数据的操作类型(读\\写)分读锁(共享锁)、写锁(排它锁)读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。写锁(排它锁):当前写操作没完成前,它会阻断其他写锁和读锁。第二章 表锁(偏读)偏向MyISAM存储引擎,开销小,加

JAVA中 ReentrantReadWriteLock读写锁详系教程,包会

一、读写锁简介现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。 针对这种场景,JAVA的并发包提供了读写锁ReentrantReadW

Java中的读写锁ReadWriteLock

ReadWriteLock是JDK中的读写锁接口ReentrantReadWriteLock是ReadWriteLock的一种实现读写锁非常适合读多写少的场景。读写锁与互斥锁的一个重要区别是读写锁允许多个线程同时读共享变量,这是读写锁在读多写少的情况下性能较高的原因。读写锁的原则:多个线程可同时读共享变量只允许一

MySQL锁

<br1\.表锁表锁分为写锁,读锁,二者读读不阻塞,读写阻塞,写写阻塞<br<br2\.行锁行锁分为共享锁,排他锁,即读锁和写锁多粒度锁机制自动实现表、行锁共存,InnoDB内部有意向表锁意向共享锁(IS):事务在给一个数据行加共享锁前必须先取得该表的IS锁。

ReentrantReadWriteLock(读写锁)

ReentrantReadWriteLock是JDK5中提供的读写分离锁。读写分离锁可以有效的帮助减少锁的竞争,以此来提升系统的性能。用锁分离的机制来提升性能也非常好理解,比如线程A,B,C进行写操作,D,E,F进行读操作,如果使用ReentrantLock或者synchronized关键字,这些线程都是串行执行的,即每次都只有一个线程做操作。但是当D进行读

Java并发系列4 - HelloWorld