package concurrent;
import java.util.Random;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
/**
*1、readLock可重入;
*2、writeLock必须等待所有的readLock释放后才可进入;
*3、writeLock范围内,readLock不可进入
*/
public class ReadWriteLockTest {
private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private ReadLock readLock = readWriteLock.readLock();
private WriteLock writeLock = readWriteLock.writeLock();
private String shareData = "寂寞等待中。。。";
public ReadWriteLockTest() {
}
public void write(String str) {
writeLock.lock();//可用tryLock()干点其他事
// if(!writeLock.tryLock()){
// System.err.println("读锁数量:"+readWriteLock.getReadLockCount());
// return;
// }
System.err.println("ThreadName:" + Thread.currentThread().getName() + " locking...");
try {
shareData = str;
System.err.println("ThreadName:" + Thread.currentThread().getName() + " 修改为:" + str);
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.err.println("ThreadName:" + Thread.currentThread().getName() + " unlock...");
writeLock.unlock();
}
}
public String read() {
readLock.lock();
System.out.println("ThreadName:" + Thread.currentThread().getName() + " lock...");
try {
System.out.println("ThreadName:" + Thread.currentThread().getName() + " 获取为:" + shareData);
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
readLock.unlock();
System.out.println("ThreadName:" + Thread.currentThread().getName() + " unlock...");
}
return shareData;
}
/**
* @param args
*/
public static void main(String[] args) {
final ReadWriteLockTest shareData = new ReadWriteLockTest();
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
@Override
public void run() {
shareData.read();
}
}, "get Thread-" + i).start();
}
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
shareData.write(new Random().nextLong() + "");
}
}, "write Thread-" + i).start();
}
}
}
分享到:
相关推荐
下面是一个简单的读写锁使用示例: ```java import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.LinkedList; public class ReadWriteLockList { private final ReentrantReadWriteLock...
在Windows操作系统中,读写锁(Read-Write Lock)是一种多线程同步原语,它允许多个线程同时读取共享资源,但在写入时仅允许一个线程访问。这提高了并发性能,尤其是在读操作远多于写操作的场景下。本篇文章将深入...
一般的读写锁代码,都是使用了临界体作为基本锁,这样就出现了在一个线程里获取临界体,但是却在另一个线程里释放临界体的问题。临界体是线程相关锁,必须做到获取...这个读写锁使用临界体和事件的组合解决了这个问题。
本话题将详细探讨在Windows和Linux环境下,如何使用C++来实现读写锁。 首先,我们来看读写锁的基本概念。读写锁通常由两个部分组成:读锁和写锁。读锁允许多个线程同时读取数据,而写锁则确保在写操作进行时没有...
其中,读写锁(Read-Write Lock,简称RWLock)是一种高效的线程同步机制,适用于大量读取操作和少量写入操作的情况。在本文中,我们将深入探讨基于关键区的Windows读写锁类及其自动锁的实现原理和改进点。 读写锁的...
- 在需要大量并发读取,偶尔修改的数据结构中,使用读写锁能有效提高程序性能。 - 在`readwritelock`这个示例中,可能包含了创建`ReentrantReadWriteLock`对象,获取读锁和写锁的代码,并通过注释解释了其工作原理...
在易语言中,我们可以使用读写锁类来实现这一功能。读写锁分为读锁和写锁,读锁可由多个线程同时持有,而写锁是独占的,一旦有线程持有了写锁,其他所有线程都无法再获取读锁或写锁。 读写锁的工作原理如下: 1. 当...
在 Linux 内核中,读写锁的实现方式是通过使用魔数(magic)来标识锁的状态。当读操作请求锁时,如果锁已经被占用,读操作将等待直到锁释放。如果写操作请求锁时,如果锁已经被占用,写操作将等待直到锁释放。 读写...
本文通过三行代码展示了如何使用读写锁解决多线程并发写入文件的冲突。 读写锁的核心在于,它允许多个线程同时读取资源,但只允许一个线程写入资源。这样,当多个线程尝试写入时,只有一个线程能够获得写锁,其他...
易语言读写锁1.2模块源码例程程序调用API函数实现读写锁功能的操作。点评:读写锁实际是一种特殊的锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则对共享资源进行写操作。这种锁相...
在这个例子中,我们讨论了如何使用读写锁(Read-Write Lock)来实现多线程环境中的并发访问控制。读写锁是一种高级的同步机制,它允许多个线程同时读取共享资源,但只允许一个线程进行写操作。这在数据读取远比写入...
通过理解并正确使用读写锁,我们可以有效地提升多线程环境下的程序性能,同时保证数据的一致性。在进行操作系统实验时,理解并实践读写锁的工作原理,对于深入学习操作系统以及提升并发编程能力至关重要。
本文实例讲述了C#解决SQlite并发异常问题的方法。分享给大家供大家参考,...作者利用读写锁(ReaderWriterLock),达到了多线程安全访问的目标。 using System; using System.Collections.Generic; using System.Text;
本文将深入探讨基于Zookeeper实现的分布式读写锁,并利用Zkclient客户端进行操作。Zookeeper是一个分布式服务协调框架,它提供了一种简单且高效的方式来实现分布式锁。 **一、Zookeeper简介** Zookeeper是由Apache...
易语言读写锁模块源码,读写锁模块,进入,退出,读锁,写锁,解锁,InitializeCriticalSection,DeleteCriticalSection,EnterCriticalSection,LeaveCriticalSection
本文将深入探讨C#中的读写锁及其使用,帮助你理解和掌握这一关键技能。 首先,读写锁提供了对共享资源的细粒度控制。在C#中,`System.Threading.ReaderWriterLockSlim`类是实现读写锁的主要工具。它的设计目标是在...
在C++编程中,读写锁(Read-Write Lock)是一种多线程同步机制,它允许多个线程同时读取共享资源,但只允许一个线程...在设计和使用读写锁时,应充分理解其工作原理,并结合具体场景进行优化,以实现最佳性能和安全性。
/*使用读写锁实现四个线程读写一段程序的实例,共创建了四个新的线程,其中两个线程用来读取数据,另外两个线程用来写入数据。在任意时刻,如果有一个线程在写数据,将阻塞所有其他线程的任何操作。*/
在Linux系统中,读写锁(Read/Write Locks,简称rwlocks)是一种多线程同步机制,它允许多个线程同时进行读操作,但只允许一个线程执行写操作。这种锁的设计目的是提高并发性能,特别是当读操作远多于写操作时。在...