欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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