java多线程并发原理(第二天)

    技术2025-08-19  14

    synchronized和ReentrantLock的区别

    ReentrantLock(再入锁):

    ReentrantLock公平性设置

    ReentrantLock fairLock = new ReentrantLock(true);

    参数为True时,倾向于将锁赋予等待时间最久的线程

    公平锁:获取锁的顺序按先后调用lock方法的顺序

    非公平性锁:抢占的顺序不一定,看运气

    synchronized是非公平性锁

    synchronized和ReentrantLock的区别

     

     

    java内存模型JMM

    JMM(Java Memory Model)本身是一种抽象的概念,描述的是一组规则,通过这组规范定义了程序中各个变量的访问方式。

    JMM中的主内存:

    存储Java实例对象包括成员变量、类信息、常量、静态变量等属于数据共享的区域,多线程并发操作时会引发线程安全问题

    JMM中的工作内存:

    存储当前方法的所有本地变量信息,本地变量对其他线程不可见字节码行号指示器、Native方法信息属于线程私有数据区域,不存在线程安全问题

    内存结构:

    方法里的基本数据类型本地变量将直接存储在工作内存的栈帧中引用类型的本地变量:引用存储在工作内存中,实例存储在主内存中成员变量、static变量、类信息均会被存储在主内存中主内存共享的方式是线程各拷贝一份数据到工作内存,操作完成后刷新回主内存

    指令重排序需要满足的条件:

    在单线程下不能改变运行的结果存在数据依赖关系的不允许重排序无法通过happens-before原则推导出来的,才能进行指令的重排序

    happens-before八大原则

    happens-before的概念:

    volatile:JVM提供的轻量级同步机制

    保证被volatile修饰的共享变量对所有线程总是可见的禁止指令重排序优化

    原子性操作时(即赋值操作等一次操作的),可以利用volatile,保证线程的安全性

    volatile为何立即可见?

    当写一个volatile变量时,JMM会把该线程对应的工作内存中的共享变量值刷新到主内存中;当读取一个volatile变量时,JMM会把该线程对应的工作内存置为无效,只能再从主内存中读取一次。

    volatile如何禁止重排序优化?

    使用内存屏障:

    1.保证特定操作的执行顺序2.保证某些变量的内存可见性

    volatile和synchronized的区别

    volatile本质是告诉JVM当前变量在工作内存中的值需要从主内存中读取synchronized则是锁定当前变量,只有当前线程可以访问该变量volatile只能使用在变量级别,synchronized则可以使用在变量、方法和类级别volatile仅能实现变量的修改可见性,synchronized则可以保证变量修改的可见性和原子性volatile不会造成线程的阻塞;synchronized可能造成线程的阻塞volatile标记的变量不会被编译器优化;synchronized标记的变量可以被优化
    Processed: 0.018, SQL: 9