JUC-how to use ReadWriteLock

本文探讨了在并发编程中如何通过ReentrantReadWriteLock实现读多写少原则,分析了不同操作场景下的锁策略,并举例展示了如何使用ReadWriteLock确保读写互斥。

as we know.JUC play a important role in in concurrent progammering,the demand for read more to write less.we should use ReadWriteLock,instead of Lock.

first and foremost.let we analyze the requirement of  read more to write less.

operation1operation2result
readreadcoexist
readwritemutex
writewritemutex

secondly,choose appropriate lock to implement requirement.

package JavaAdvanced;

import com.sun.corba.se.spi.ior.ObjectKey;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @author 韦海涛
 * @version 1.0
 * @date 4/2/2021 1:44 PM
 * 多个线程同时读一个资源类没有任何问题,所以为了满足并发量,读取共享资源应该同时进行。
 * 但是有一个线程想去写共享资源来,就不应该再有其他线程进行读或者写
 * 小总结:
 *  读-读-共存
 *  读-写-不共存
 *  写-写-不共存
 *
 *  写操作:原子+独占:整个过程必须是一个完整的统一体,中间不允许被打断
 *
 *
 */

class MyCache{
    private volatile Map<String, Object> map = new HashMap<>();
    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

    public void put(String key,Object value){
        lock.writeLock().lock();
        try {
            System.out.println(Thread.currentThread().getName()+"\t正在写入");
            TimeUnit.SECONDS.sleep(3);
            map.put(key,value);
            System.out.println(Thread.currentThread().getName()+"\t写入完成");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.writeLock().unlock();
        }

    }

    public void get(String key){
        lock.readLock().lock();
        try {
            System.out.println(Thread.currentThread().getName()+"\t正在读取");
            TimeUnit.SECONDS.sleep(3);
            Object result = map.get(key);
            System.out.println(Thread.currentThread().getName()+"\t读取完成"+result);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            lock.readLock().unlock();
        }
    }
}

public class ReadWriteLockDemo {
    public static void main(String[] args) {
        MyCache myCache = new MyCache();
        for (int i = 0; i < 5; i++) {
            final int tempInt = i;
            new Thread(()->{
                myCache.put(tempInt+"",tempInt+"");
            },String.valueOf(i)).start();
        }

        for (int i = 0; i < 5; i++) {
            final int tempInt = i;
            new Thread(()->{
                myCache.get(tempInt+"");
            },String.valueOf(i)).start();
        }
    }
}

refer to the above code,we can konw,if write locked.the next write lock cannot achieve,and read lock also cannot achieve until current wirte unlocked.

### JUC-II中变址寻址的微指令实现细节 #### 1. 变址寻址的基本概念 变址寻址是一种通过基址寄存器与偏移量相加生成有效地址的寻址方式。其核心思想是将指令中的偏移量字段与指定的基址寄存器内容相加,从而计算出目标地址[^1]。在JUC-II模型机中,这种寻址方式常用于数组访问和间接跳转等场景。 #### 2. 微指令的设计原则 微指令是控制计算机硬件执行具体操作的最小单位。在JUC-II模型机中,微指令需要明确描述每一步的操作,包括数据路径的选择、算术逻辑单元(ALU)的操作以及存储器的访问等[^2]。对于变址寻址,微指令设计需满足以下要求: - 提取指令中的偏移量。 - 获取基址寄存器的内容。 - 执行加法操作以生成有效地址。 - 使用有效地址访问内存或寄存器。 #### 3. 微指令的具体实现 以下是针对JUC-II模型机中变址寻址的微指令实现细节: ##### (1) 提取偏移量 从当前指令中提取偏移量字段,并将其存储到临时寄存器中。假设偏移量位于指令的低16位,则微指令可以表示为: ```plaintext MicroOp1: TempReg ← Instruction[15:0] ``` ##### (2) 获取基址寄存器内容 读取指定基址寄存器的内容,并将其加载到另一个临时寄存器中。例如,如果基址寄存器为`Rb`,则微指令为: ```plaintext MicroOp2: BaseRegContent ← Rb ``` ##### (3) 计算有效地址 将偏移量与基址寄存器内容相加,生成有效地址。此操作通常由ALU完成: ```plaintext MicroOp3: EffectiveAddress ← BaseRegContent + TempReg ``` ##### (4) 访问目标地址 使用计算出的有效地址访问内存或寄存器。例如,如果目标是内存单元,则微指令为: ```plaintext MicroOp4: Data ← Memory[EffectiveAddress] ``` #### 4. 微指令的编码形式 微指令的编码形式决定了其在硬件中的实现方式。在JUC-II模型机中,微指令通常采用水平型或垂直型编码[^2]。以下是水平型微指令的一个示例: ```plaintext | 控制信号 | 数据路径选择 | ALU操作 | 存储器访问 | |----------|--------------|---------|------------| | 1 | Src1: BaseRegContent, Src2: TempReg | Add | MemRead | ``` 在此示例中,控制信号指定了ALU执行加法操作,并且选择了`BaseRegContent`和`TempReg`作为输入源。同时,还启用了存储器读操作。 #### 5. 实现中的注意事项 - 确保基址寄存器和偏移量的范围符合硬件限制。 - 如果有效地址超出内存范围,应触发异常处理机制。 - 微指令设计需与硬件结构紧密配合,确保每一步操作都能正确映射到具体的控制信号。 #### 示例代码 以下是一个基于JUC-II模型机的变址寻址微程序伪代码示例: ```plaintext # 提取偏移量 MicroOp1: TempReg ← Instruction[15:0] # 获取基址寄存器内容 MicroOp2: BaseRegContent ← Rb # 计算有效地址 MicroOp3: EffectiveAddress ← BaseRegContent + TempReg # 访问目标地址 MicroOp4: Data ← Memory[EffectiveAddress] ``` #### 6. 相关理论支持 通过设计控制器的微程序,可以实现JUC-II模型机的指令系统,并加深对计算机结构和工作原理的理解。变址寻址作为其中一种重要的寻址方式,其微程序设计对于理解指令执行过程具有重要意义。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值