多线程补充1

内存分为主存和工作内存
工作内存包括线程私有栈和 寄存器(对主存变量拷贝)
每个线程都有自己的工作内存 保存的是对主存内容的拷贝

voliate保证内存的可见性 线程修改其他线程必须知道
所以voliate修饰的变量修改之后会被刷新到主存 其他线程使用前必须从主存中刷新
又能禁止指令重排序 指令执行时的相对顺序不会变
其不能保证原子性

synchronized 依赖于JVM 保证了同一时刻只有一个线程在作用范围内操作 保证了可见,有序和原子 三种同步特性

作用范围取决于修饰什么

synchronized
修饰代码块 被称作同步语句块 同步范围为代码块内 作用的对象为调用者 代码块为临界区 互斥区
修饰方法 称作同步方法 同步范围为方法内 作用的对象为调用者
修饰静态方法 作用的范围是整个静态方法 作用的对象是这个类的所有对象
修饰类 其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象。

synchronized 修饰实例方法和修饰静态方法有啥不一样?
修饰实例方法作用为这个实例调用这个方法 是同步的
修饰静态方法 作用的是这个类所有实例调用这个方法是同步的



这种锁需要自己定义加锁和解锁的时机 操作不当可能造成死锁
但使用锁接口 可以定义锁的实现 粒度更小 更灵活 但没有synchronized使用方便
展开
评论