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

时间:2022-06-04 21:30:35

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

Java中,ReadWriteLock这个接口就为我们实现了这个需求,通过他的实现类ReentrantReadWriteLock我们可以很简单的来实现刚才的效果,下面我们使用一个例子来说明这个类的用法。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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();
  }
}

 

下面是读和写两个不同的类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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());
    }
  }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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读写分离的实现代码的全部内容,希望对大家有所帮助。有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对服务器之家网站的支持。

原文链接:http://blog.csdn.net/a352193394/article/details/39405287#comments