java readandwrite_Java并发ReadWriteLock接口

全屏

java.util.concurrent.locks.ReadWriteLock接口允许一次读取多个线程,但一次只能写入一个线程。读锁 - 如果没有线程锁定ReadWriteLock进行写入,则多线程可以访问读锁。

写锁 - 如果没有线程正在读或写,那么一个线程可以访问写锁。

锁方法

以下是Lock类中可用的重要方法的列表。编号方法描述1public Lock readLock()返回用于读的锁。

2public Lock writeLock()返回用于写的锁。

示例

以下TestThread程序演示了ReadWriteLock接口的这些方法。这里我们使用readlock()获取读锁定和writeLock()来获取写锁定。import java.util.concurrent.locks.ReentrantReadWriteLock;

public class TestThread {

private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);

private static String message = "a";

public static void main(String[] args) throws InterruptedException{

Thread t1 = new Thread(new WriterA());

t1.setName("Writer A");

Thread t2 = new Thread(new WriterB());

t2.setName("Writer B");

Thread t3 = new Thread(new Reader());

t3.setName("Reader");

t1.start();

t2.start();

t3.start();

t1.join();

t2.join();

t3.join();

}

static class Reader implements Runnable {

public void run() {

if(lock.isWriteLocked()) {

System.out.println("Write Lock Present.");

}

lock.readLock().lock();

try {

Long duration = (long) (Math.random() * 10000);

System.out.println(Thread.currentThread().getName()

+ "  Time Taken " + (duration / 1000) + " seconds.");

Thread.sleep(duration);

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

System.out.println(Thread.currentThread().getName() +": "+ message );

lock.readLock().unlock();

}

}

}

static class WriterA implements Runnable {

public void run() {

lock.writeLock().lock();

try {

Long duration = (long) (Math.random() * 10000);

System.out.println(Thread.currentThread().getName()

+ "  Time Taken " + (duration / 1000) + " seconds.");

Thread.sleep(duration);

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

message = message.concat("a");

lock.writeLock().unlock();

}

}

}

static class WriterB implements Runnable {

public void run() {

lock.writeLock().lock();

try {

Long duration = (long) (Math.random() * 10000);

System.out.println(Thread.currentThread().getName()

+ "  Time Taken " + (duration / 1000) + " seconds.");

Thread.sleep(duration);

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

message = message.concat("b");

lock.writeLock().unlock();

}

}

}

}

这将产生以下结果,如下所示 -Writer A  Time Taken 6 seconds.

Write Lock Present.

Writer B  Time Taken 2 seconds.

Reader  Time Taken 0 seconds.

Reader: aab

分享到:

0评论

14487a65ea137d8f9ac97cdce44a0324.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值