当前位置: 移动技术网 > IT编程>开发语言>Java > Java多线程之readwritelock读写分离的实现代码

Java多线程之readwritelock读写分离的实现代码

2019年07月19日  | 移动技术网IT编程  | 我要评论

在多线程开发中,经常会出现一种情况,我们希望读写分离。就是对于读取这个动作来说,可以同时有多个线程同时去读取这个资源,但是对于写这个动作来说,只能同时有一个线程来操作,而且同时,当有一个写线程在操作这个资源的时候,其他的读线程是不能来操作这个资源的,这样就极大的发挥了多线程的特点,能很好的将多线程的能力发挥出来。

在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通过卖票理解多线程等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对移动技术网网站的支持。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网