- 浏览: 62796 次
- 性别:
- 来自: 成都
文章分类
最新评论
//ReentrantReadWriteLock的WriteLock //WriteLock的lock方法 public void lock() { sync.acquire(1); } public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); } protected final boolean tryAcquire(int acquires) { Thread current = Thread.currentThread(); //获取state状态 int c = getState(); int w = exclusiveCount(c); //如果c不为0说明当前有线程获取了锁 if (c != 0) { // (Note: if c != 0 and w == 0 then shared count != 0) //当前线程不是当前正在运行的独占线程 if (w == 0 || current != getExclusiveOwnerThread()) return false; if (w + exclusiveCount(acquires) > MAX_COUNT) throw new Error("Maximum lock count exceeded"); // Reentrant acquire setState(c + acquires); return true; } if (writerShouldBlock() || !compareAndSetState(c, c + acquires)) return false; setExclusiveOwnerThread(current); return true; } final boolean writerShouldBlock() { return false; // writers can always barge } //WriteLock简单来说就是判断当前有没有线程占用锁,有则入队等待唤醒。没有直接占用运行。 WriteLock的unlock方法: public void unlock() { sync.release(1); } public final boolean release(int arg) { if (tryRelease(arg)) { Node h = head; if (h != null && h.waitStatus != 0) unparkSuccessor(h); return true; } return false; } //设置状态以及将独占线程设置为null protected final boolean tryRelease(int releases) { if (!isHeldExclusively()) throw new IllegalMonitorStateException(); int nextc = getState() - releases; boolean free = exclusiveCount(nextc) == 0; if (free) setExclusiveOwnerThread(null); setState(nextc); return free; } //WriteLock的其他方法和Reentrant基本一致。WriteLock本身就相当于ReentrantLock互斥锁。
发表评论
-
读ThreadLocal源代码
2017-10-12 15:00 239//可以存取线程局部变量 //先看构造函数 pub ... -
读Exchanger源码
2017-10-10 11:38 330//用于线程间交换数据 public V exchang ... -
读Executors源码
2017-09-29 15:23 259//一个管理线程创建的类里面都是静态方法 //创建一 ... -
读ScheduledThreadPoolExecutor源码
2017-09-25 17:33 411//一个可以延迟执行的定时任务 //先看构造函数 构造函 ... -
读部分ThreadPoolExecutor源码
2017-09-25 15:27 304//线程池 //先看构造方法 public Threa ... -
读AbstractExecutorService
2017-09-23 16:34 322//他是ExecutorService的部分实现 pub ... -
读ExecutorCompletionService源码
2017-09-23 11:22 485//一个用来管理已完成任务的service,内部封装了一个 ... -
读FutureTask源码
2017-09-22 16:45 269//一个可以异步返回计算的结果 //它同时实现了Futu ... -
读ConcurrentSkipListMap源码
2017-09-21 15:11 289//数据结构是跳表 关于数据结构http://blog.c ... -
读Semaphore源码
2017-09-09 14:58 292//一个信号量,只有在池中还拥有许可时才允许线程继续执行。 ... -
读CyclicBarrier源码
2017-09-01 17:59 344//一个循环的屏障。所有的线程在屏障处等待其他线程执行完毕 ... -
读CountDownLatch源码
2017-09-01 14:01 321//在完成一组操作之前允许一个或多个线程等待内部用的AQS ... -
读ConcurrentLinkedQueue
2017-09-01 11:40 286//这是一个无阻塞的队列没有加任何锁全部利用CAS机制实现 ... -
读ConcurrentHashMap源码
2017-08-31 11:21 273//先看构造函数 public ConcurrentHa ... -
读CopyOnWriteArrayList源码
2017-08-22 12:59 406//在该集合上的写操作都是在原有的副本上进行的操作。这样可 ... -
读LinkedBlockingDeque源码
2017-08-21 14:26 559//这是一个支持双端操作的可阻塞队列 //先看构造函数 ... -
读SynchronousQueue源码
2017-08-10 10:51 374//先看构造方法 public SynchronousQ ... -
读PriorityBlocking源码
2017-08-09 13:47 353//一个基于而为堆的优先级队列,它是无界的。 //先看构 ... -
读DelayQueen源码
2017-08-07 15:16 274//一个基于二叉堆优先 ... -
LinkedblockingQueue源码解读
2017-08-04 13:03 347//LinkedBlockQueue //先看构造函数 ...
相关推荐
其中,`readLock()`和`writeLock()`方法分别用于获取读锁和写锁,它们使用CAS操作来保证线程安全。在读锁的实现中,ReentrantReadWriteLock支持读锁的重入,而写锁同样支持重入,但写锁具有更高的优先级,即使有多个...
本主题将深入探讨“同步读锁”和“异步互斥写锁”的概念、实现原理以及源码分析,主要以`LockDemo`为例进行阐述。 首先,我们需要了解锁的基本类型:互斥锁(Mutex)和读写锁(Read-Write Lock)。互斥锁提供独占式...
在计算机编程领域,特别是在多线程并发环境下,保持线程同步是至关重要的。..."计算机软件-商业源码-利用读写锁保持线程同步.zip"这个压缩包很可能包含了这样的示例代码,可以帮助开发者更好地理解并实践读写锁的用法。
基于JDK源码解析Java并发锁,我们需要关注以下几个关键知识点: 1. **AQS(AbstractQueuedSynchronizer)基础同步器**: AQS是一个用于构建锁和同步器的框架,它维护了一个FIFO的等待队列,提供了两种模式:独占和...
在Java中,`java.util.concurrent.locks.ReadWriteLock`接口提供了这种功能,它有两个主要的方法:`readLock()` 和 `writeLock()`. 这两个方法分别返回一个读锁和写锁,它们可以被不同的线程独立获取和释放,从而...
lock.writeLock().unlock(); } } public String get(String key) { lock.readLock().lock(); try { return map.get(key); } finally { lock.readLock().unlock(); } } ``` 2. **其他策略**:根据具体...
ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock(); ``` 使用读锁和写锁的方式如下: ```java // 获取读锁 readLock.lock(); try { // 读操作 } finally { readLock.unlock(); ...
- 它提供了`ReadLock`和`WriteLock`接口,分别代表读锁和写锁,可以通过`lock()`和`unlock()`方法来获取和释放锁。 3. **读写锁的应用**: - 在需要大量并发读取,偶尔修改的数据结构中,使用读写锁能有效提高...
WriteLock writeLock = lock.writeLock(); ``` 2. **读者部分**:当一个线程想要读取数据时,它需要获取读锁。 ```java readLock.lock(); try { // 读取数据的操作 } finally { readLock.unlock(); } ``` 3. **...
- `writeLock`:二进制信号量,表示写者是否正在写入,初始化为1,表示无写者。 2. **读者进程**: - 请求`writeLock`,确保没有写者正在写入。 - 增加`readCount`,表示有一个新的读者开始读取。 - 如果还有...
slock.writeLock(async () => { resource.value++; }); // 读锁 slock.readLock(async () => { console.log(`Current value: ${resource.value}`); }); ``` ### 5. 深入学习 `slock-js-master`目录包含了`slock...
Lock writeLock = lock.writeLock(); // 获取写锁 writeLock.lock(); System.out.println("got the write lock"); // 降级到读锁 readLock.lock(); System.out.println("got the read lock"); // 释放锁 ...
lock.writeLock().lock(); try { list.add(item); } finally { lock.writeLock().unlock(); } } public void remove(String item) { lock.writeLock().lock(); try { list.remove(item); } finally { ...
private final ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock(); public void read() { readLock.lock(); try { // 读取操作 } finally { readLock.unlock(); } } public void write() ...
WriteLock writeLock = lock.writeLock(); writeLock.lock(); // 获取写锁 // 写入操作 writeLock.unlock(); // 释放写锁 ``` ### 4. 可重入性 `ReentrantReadWriteLock`支持可重入性,这意味着一个线程在持有读锁...
读写锁的核心在于它的两个主要方法:`ReadLock()` 和 `WriteLock()`。在读写锁实现的例子中,`CRWMutex` 类是读写锁的实现类,它包含了一些辅助类 `RLock` 和 `WLock` 用于简化读写锁的获取和释放过程。 `RLock` 类...
接着,调用WriteLock函数写入数据,如:`libcdll5.WriteLock(1, Lockdata, password)`,其中`password`是写入操作的密码。 正式的加密过程分为多个步骤: 1. 确保CSample程序在未加密状态下能够正常运行。 2. 使用...
- **writeLock()**:获取写锁。 - **unlock()**:释放锁。 #### 四、线程池源码分析 - **核心组件**: - **ExecutorService**:提供了一个高级接口来创建和管理线程。 - **ThreadPoolExecutor**:实现`...
在公平模式下,`readLock().lock()`和`writeLock().lock()`会遵循FIFO(先进先出)原则,等待最久的线程将首先获得锁。当一个写者在写入时,所有读者和写者都会被阻塞;当写者完成写入并释放写锁后,如果有等待的...
在 ReentrantReadWriteLock 中,有两个内部类:ReadLock 和 WriteLock,这两个内部类分别实现了读锁和写锁的功能。 ReadLock 和 WriteLock ReadLock 和 WriteLock 都是 ReentrantReadWriteLock 的内部类,它们实现...