Java多线程之readwritelock读写分离的实现代码
程序员文章站
2024-04-01 18:29:04
在多线程开发中,经常会出现一种情况,我们希望读写分离。就是对于读取这个动作来说,可以同时有多个线程同时去读取这个资源,但是对于写这个动作来说,只能同时有一个线程来操作,而且...
在多线程开发中,经常会出现一种情况,我们希望读写分离。就是对于读取这个动作来说,可以同时有多个线程同时去读取这个资源,但是对于写这个动作来说,只能同时有一个线程来操作,而且同时,当有一个写线程在操作这个资源的时候,其他的读线程是不能来操作这个资源的,这样就极大的发挥了多线程的特点,能很好的将多线程的能力发挥出来。
在java中,readwritelock这个接口就为我们实现了这个需求,通过他的实现类reentrantreadwritelock我们可以很简单的来实现刚才的效果,下面我们使用一个例子来说明这个类的用法。
package com.bird.concursey.charpet3; import java.util.concurrent.locks.readwritelock; import java.util.concurrent.locks.reentrantreadwritelock; public class pricesinfo { private double price1; private double price2; private readwritelock lock; public pricesinfo() { price1 = 1.0; price2 = 2.0; lock = new reentrantreadwritelock(); } public double getprice1() { //读取资源锁定 lock.readlock().lock(); double value = price1; lock.readlock().unlock(); return value; } public double getprice2() { lock.readlock().lock(); double value = price2; lock.readlock().unlock(); return value; } public void setprices(double price1, double price2) { lock.writelock().lock(); this.price1 = price1; this.price2 = price2; lock.writelock().unlock(); } }
下面是读和写两个不同的类
package com.bird.concursey.charpet3; public class reader implements runnable { private pricesinfo pricesinfo; public reader(pricesinfo pricesinfo) { this.pricesinfo = pricesinfo; } @override public void run() { for (int i = 0; i < 10; i++) { system.out.printf("%s: price 1: %f\n", thread.currentthread() .getname(), pricesinfo.getprice1()); system.out.printf("%s: price 2: %f\n", thread.currentthread() .getname(), pricesinfo.getprice2()); } } }
package com.bird.concursey.charpet3; public class writer implements runnable { private pricesinfo pricesinfo; public writer(pricesinfo pricesinfo) { this.pricesinfo = pricesinfo; } @override public void run() { for (int i = 0; i < 3; i++) { system.out.printf("writer: attempt to modify the prices.\n"); pricesinfo.setprices(math.random() * 10, math.random( ) * 8); system.out.printf("writer: prices have been modified.\n"); try { thread.sleep(2); } catch (interruptedexception e) { e.printstacktrace(); } } } public static void main(string[] args) { pricesinfo pricesinfo = new pricesinfo(); reader readers[] = new reader[5]; thread threadsreader[] = new thread[5]; for (int i = 0; i < 5; i++){ readers[i] = new reader(pricesinfo); threadsreader[i] = new thread(readers[i]); } writer writer = new writer(pricesinfo); thread threadwriter = new thread(writer); for (int i = 0; i < 5; i++){ threadsreader[i].start(); } threadwriter.start(); } }
总结
以上就是本文关于java多线程之readwritelock读写分离的实现代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:java多线程阻塞与唤醒代码示例 、 java多线程forkjoinpool实例详解 、 、java通过卖票理解多线程等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对网站的支持。