`

Java读写锁基本使用

阅读更多
    ReadWriteLock使得你可以同时具有多个读取者,只要他们都不试图写入即可。如果写锁被其他任务持有,那么任何读取者均不能访问,直至这个写锁被释放为止。
    ReadWriteLock能否提高性能是不确定的,取决于数据读取与修改频率相比较的结果,读取和写入操作的时间,竞争的线程数以及是否是多处理器等等。
    下面展示了ReadWriteLock最基本的用法。

package concurrency;

//: concurrency/ReaderWriterList.java
import java.util.concurrent.*;
import java.util.concurrent.locks.*;
import java.util.*;

public class ReaderWriterList<T> {
	private ArrayList<T> lockedList;
	// Make the ordering fair:
	private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);

	public ReaderWriterList(int size, T initialValue) {
		lockedList = new ArrayList<T>(Collections.nCopies(size, initialValue));
	}

	public T set(int index, T element) {
		Lock wlock = lock.writeLock();
		wlock.lock();
		try {
			return lockedList.set(index, element);
		} finally {
			wlock.unlock();
		}
	}

	public T get(int index) {
		Lock rlock = lock.readLock();
		rlock.lock();
		try {
			// Show that multiple readers
			// may acquire the read lock:
			if (lock.getReadLockCount() > 1)
				System.out.println(lock.getReadLockCount());
			return lockedList.get(index);
		} finally {
			rlock.unlock();
		}
	}

	public static void main(String[] args) throws Exception {
		new ReaderWriterListTest(30, 1);
	}
}

class ReaderWriterListTest {
	ExecutorService exec = Executors.newCachedThreadPool();
	private final static int SIZE = 100;
	private static Random rand = new Random(47);
	private ReaderWriterList<Integer> list = new ReaderWriterList<Integer>(
			SIZE, 0);

	private class Writer implements Runnable {
		public void run() {
			try {
				for (int i = 0; i < 20; i++) { // 2 second test
					list.set(i, rand.nextInt());
					TimeUnit.MILLISECONDS.sleep(100);
				}
			} catch (InterruptedException e) {
				// Acceptable way to exit
			}
			System.out.println("Writer finished, shutting down");
			exec.shutdownNow();
		}
	}

	private class Reader implements Runnable {
		public void run() {
			try {
				while (!Thread.interrupted()) {
					for (int i = 0; i < SIZE; i++) {
						list.get(i);
						TimeUnit.MILLISECONDS.sleep(1);
					}
				}
			} catch (InterruptedException e) {
				// Acceptable way to exit
			}
		}
	}

	public ReaderWriterListTest(int readers, int writers) {
		for (int i = 0; i < readers; i++)
			exec.execute(new Reader());
		for (int i = 0; i < writers; i++)
			exec.execute(new Writer());
	}
} /* (Execute to see output) */// :~


程序输出结果如下:
24
25
22
19
17
16
...
...//省略
7
6
5
4
3
Writer finished, shutting down
set()方法获取写锁,get方法获取读锁,并且检查是否有多个线程获取了读锁,如果是就打印这种读取者的数量到控制台,以证明可以有多个读取者获得读锁。
分享到:
评论

相关推荐

    关于读写锁算法的Java实现及思考

    关于读写锁算法的Java实现及思考,是一个深入探讨了多线程...通过本文的讲解,我们不仅学习到了读写锁的基本概念,也深入探讨了其在Java中的具体应用和自定义实现,这对于提高软件开发中的并发编程能力具有重要意义。

    Java编程读写锁详解

    读写锁的基本规则是: * 读读不互斥:多个线程可以同时读取同一个资源 * 读写互斥:读线程和写线程不能同时访问同一个资源 * 写写互斥:多个线程不能同时写入同一个资源 读写锁的优点是允许读读的并发,提高了程序...

    多线程(22)读写锁分离模式1

    Java中提供了`java.util.concurrent.locks.ReadWriteLock`接口来支持这种模式,但在本案例中,我们将模拟实现一个读写锁来理解其基本原理。 1. **读写锁接口定义**: - `Lock`接口:这是基础的锁接口,提供了获取...

    java简单的读写文件小程序

    这个"java简单的读写文件小程序"很可能是用来演示如何使用Java API进行文件操作的基本概念。下面,我们将深入探讨Java中读取和写入文件的相关知识点。 1. **Java.IO 包**:Java.IO 包提供了所有与输入/输出相关的类...

    8、读写锁ReentrantReadWriteLock&StampLock详解.pdf

    #### 1.1 读写锁的基本概念 读写锁是一种特殊的锁机制,它可以支持多个线程同时读取共享资源,但在任何时刻只允许一个线程修改这个资源。这种类型的锁非常适合那些读操作远远多于写操作的场景。具体来说: - **读读...

    Java并发锁简介-动力节点共9页.pdf.zip

    3. **读写锁(ReadWriteLock)**:读写锁也是`java.util.concurrent.locks`的一部分,它为读操作和写操作提供不同的锁。读锁是共享的,允许多个线程同时读取数据;写锁是独占的,一次只有一个线程能写数据。这种设计...

    Java io 读写文件

    综上所述,Java的IO API提供了丰富的功能来处理文件读写,包括基本的字节流操作和高效的缓冲机制。了解和熟练掌握这些工具是开发Java应用程序的基础。通过实践和理解这些概念,你可以编写出高效且健壮的文件处理代码...

    nio.rar_FastCopyFile.java_NIO_UseFloatBuffer.java_java nio_文件锁

    在传统的Java I/O中,我们通常使用InputStream和OutputStream进行文件复制,而这种方式需要不断读写,造成大量的上下文切换,效率较低。NIO通过通道和缓冲区的配合,可以实现批量读写,减少系统调用,从而提高性能。...

    java文件读写

    本篇文章将深入探讨Java中的文件读写机制,包括基本API的使用、流的概念、异常处理以及实用技巧。 首先,Java提供了一系列的类来支持文件操作,如`java.io.File`用于文件和目录的操作,`java.io.FileReader`、`java...

    面试官:有没有比读写锁更快的锁?

    读写锁:在多线程环境下,读写锁(如Java中的ReentrantReadWriteLock)提供了一种优化方案。它允许多个线程同时读取数据,但仅允许一个线程写入。当写锁被持有时,其他写操作和读操作都会被阻塞,确保数据的一致性。...

    springboot 集成Redission 简单完美解决分布式锁

    5. **其他高级特性**:除了基本的锁功能,Redisson还提供了许多高级特性,如读写锁、公平锁、信号量、原子整数等。你可以根据具体需求选择合适的数据结构。 集成Redission到SpringBoot项目后,我们可以轻松地实现...

    多线程模拟读者写者问题,采用读写平等方式

    在实际项目中,Java并发库提供了`java.util.concurrent.locks.ReentrantReadWriteLock`类,它是一个可重入的读写锁,可以更高效地处理读写冲突,但这里我们选择了一个更基础的实现,以便更好地理解读者写者问题的...

    java进阶提高学习教程-14锁机制.pptx

    在 Java 中,锁有多种不同的实现机制,如可重入锁、读写锁、互斥锁、悲观锁、乐观锁、公平锁、锁消除、独享锁、共享锁等。 可重入锁 可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍然...

    JAVA中锁概及运用.doc

    通过以上介绍,我们可以了解到Oracle数据库中锁的基本概念和分类,以及如何在Java应用程序中利用这些锁来实现对数据的一致性和并发性的控制。合理使用锁能够有效避免数据冲突,提高系统的稳定性和效率。

    同步读锁,异步互斥写锁源码

    首先,我们需要了解锁的基本类型:互斥锁(Mutex)和读写锁(Read-Write Lock)。互斥锁提供独占式访问,即一次只允许一个线程访问共享资源,保证了写操作的安全性。而读写锁则进一步区分了读取和写入操作,允许多个...

    Java编程之文件读写实例详解

    本篇文章将详细解析Java中如何进行文件读写操作,并通过实例演示不同方式的使用。 首先,Java中的文件读写操作主要用于将内存中的数据持久化存储到文件中,或者从文件中恢复数据到内存。这一过程通常涉及到Java I/O...

    Java心得文件

    常见的解决方案包括使用`synchronized`关键字对关键代码段加锁,或采用`ReentrantLock`等更高级的锁机制。 #### 结语 通过本文的深入探讨,我们不仅理解了Java网络编程的基本原理,还掌握了多线程机制的关键技术。...

    Java 并发编程实战.pdf

    在并发控制方面,《Java并发编程实战》可能会探讨不同类型的锁,如互斥锁(Mutex)、读写锁(ReadWriteLock)、乐观锁和悲观锁等,以及它们的应用场景和性能影响。作者可能会使用实例代码来演示如何在实际应用中使用...

    基于Java的源码-读写文本文件的示例代码.zip

    在多线程环境中,可能需要使用`java.nio.channels.FileLock`来实现文件的锁,确保多个线程安全地访问同一文件。 9. **编码与解码**: 文件的读写还涉及到字符编码,Java允许指定编码,如UTF-8: ```java ...

    JAVA_API1.6文档(中文)

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

Global site tag (gtag.js) - Google Analytics