您好,欢迎访问一九零五行业门户网

Java读写锁的用法及其优点是什么?

前言:
读写锁(readers-writer lock)顾名思义是一把锁分为两部分:读锁和写锁,其中读锁允许多个线程同时获得,因为读操作本身是线程安全的,而写锁则是互斥锁,不允许多个线程同时获得写锁,并且写操作和读操作也是互斥的。总结来说,读写锁的特点是:读读不互斥、读写互斥、写写互斥。
1.读写锁使用在 java 语言中,读写锁是使用 reentrantreadwritelock 类来实现的,其中:
reentrantreadwritelock.readlock表示读锁,它提供了 lock 方法进行加锁、unlock 方法进行解锁。
reentrantreadwritelock.writelock表示写锁,它提供了 lock 方法进行加锁、unlock 方法进行解锁。
它的基础使用如下代码所示:
// 创建读写锁final reentrantreadwritelock readwritelock = new reentrantreadwritelock();// 获得读锁final reentrantreadwritelock.readlock readlock = readwritelock.readlock();// 获得写锁final reentrantreadwritelock.writelock writelock = readwritelock.writelock();// 读锁使用readlock.lock();try { // 业务代码...} finally { readlock.unlock();}// 写锁使用writelock.lock();try { // 业务代码...} finally { writelock.unlock();}
1.1 读读不互斥多个线程可以同时获取到读锁,称之为读读不互斥,如下代码所示:
// 创建读写锁final reentrantreadwritelock readwritelock = new reentrantreadwritelock();// 创建读锁final reentrantreadwritelock.readlock readlock = readwritelock.readlock();thread t1 = new thread(() -> { readlock.lock(); try { system.out.println("[t1]得到读锁."); thread.sleep(3000); } catch (interruptedexception e) { e.printstacktrace(); } finally { system.out.println("[t1]释放读锁."); readlock.unlock(); }});t1.start();thread t2 = new thread(() -> { readlock.lock(); try { system.out.println("[t2]得到读锁."); thread.sleep(3000); } catch (interruptedexception e) { e.printstacktrace(); } finally { system.out.println("[t2]释放读锁."); readlock.unlock(); }});t2.start();
以上程序执行结果如下:
1.2 读写互斥读锁和写锁同时使用是互斥的(也就是不能同时获得),这称之为读写互斥,如下代码所示:
// 创建读写锁final reentrantreadwritelock readwritelock = new reentrantreadwritelock();// 创建读锁final reentrantreadwritelock.readlock readlock = readwritelock.readlock();// 创建写锁final reentrantreadwritelock.writelock writelock = readwritelock.writelock();// 使用读锁thread t1 = new thread(() -> { readlock.lock(); try { system.out.println("[t1]得到读锁."); thread.sleep(3000); } catch (interruptedexception e) { e.printstacktrace(); } finally { system.out.println("[t1]释放读锁."); readlock.unlock(); }});t1.start();// 使用写锁thread t2 = new thread(() -> { writelock.lock(); try { system.out.println("[t2]得到写锁."); thread.sleep(3000); } catch (interruptedexception e) { e.printstacktrace(); } finally { system.out.println("[t2]释放写锁."); writelock.unlock(); }});t2.start();
以上程序执行结果如下:
1.3 写写互斥多个线程同时使用写锁也是互斥的,这称之为写写互斥,如下代码所示:
// 创建读写锁final reentrantreadwritelock readwritelock = new reentrantreadwritelock();// 创建写锁final reentrantreadwritelock.writelock writelock = readwritelock.writelock();thread t1 = new thread(() -> { writelock.lock(); try { system.out.println("[t1]得到写锁."); thread.sleep(3000); } catch (interruptedexception e) { e.printstacktrace(); } finally { system.out.println("[t1]释放写锁."); writelock.unlock(); }});t1.start();thread t2 = new thread(() -> { writelock.lock(); try { system.out.println("[t2]得到写锁."); thread.sleep(3000); } catch (interruptedexception e) { e.printstacktrace(); } finally { system.out.println("[t2]释放写锁."); writelock.unlock(); }});t2.start();
以上程序执行结果如下:
2.优点分析提高了程序执行性能:多个读锁可以同时执行,相比于普通锁在任何情况下都要排队执行来说,读写锁提高了程序的执行性能。
避免读到临时数据:读锁和写锁是互斥排队执行的,这样可以保证了读取操作不会读到写了一半的临时数据。
3.适用场景读写锁适合多读少写的业务场景,此时读写锁的优势最大。
以上就是java读写锁的用法及其优点是什么?的详细内容。
其它类似信息

推荐信息