多线程
文章平均质量分 65
Lambda丶雨辰
这个作者很懒,什么都没留下…
展开
-
volatile在可见性和有序性的基础上,如何保证原子性
获取共享变量时,为了保证该变量的可见性,需要使用 volatile 修饰。它可以用来修饰成员变量和静态成员变量,他可以避免线程从自己的工作缓存中查找变量的值,必须到主存中获取它的值,线程操作 volatile 变量都是直接操作主存。即一个线程对 volatile 变量的修改,对另一个线程可见。CAS 必须借助 volatile 才能读取到共享变量的最新值来实现【比较并交换】的效果在JDK1.5之后提供了一个在util包下的comcurrent包下的atomic包(原子包) 里面提供对各种类的原子操作原创 2022-06-03 12:05:38 · 448 阅读 · 0 评论 -
偏向锁的设置和被取消
偏向锁的格式头:开启偏向锁的方式:禁用偏向锁VM 参数 -XX:-UseBiasedLocking特殊情况:调用 对象的hashcode方法时,偏向锁也会被禁用. 这是因为调用了对象的 hashCode,但偏向锁的对象 MarkWord 中存储的是线程 id(54位),如果调用 hashCode(31位) 会导致偏向锁被撤销撤销 - 其它线程使用对象:当有其它线程使用偏向锁对象时,会将偏向锁升级为轻量级锁批量...原创 2022-05-30 21:09:52 · 650 阅读 · 0 评论 -
轻量级锁及其升级为重量级锁的过程
轻量级锁的使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以 使用轻量级锁来优化。轻量级锁对使用者是透明的,即语法仍然是synchronizedjava中synchronized默认是轻量级锁,但当有线程在同一时间发生锁竞争时,轻量级锁会升级为重量级锁Monitor假设有两个方法同步块,利用同一个对象加锁static final Object lock = new Object();public static void method1() {转载 2022-05-29 23:51:49 · 2119 阅读 · 0 评论 -
JAVA原理之 Monitor(锁)
Monitor 被翻译为监视器或管程每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针Monitor 结构如下 刚开始 Monitor 中 Owner 为 null 当 Thread-2 执行 synchronized(obj) 就会将 Monitor 的所有者 Owner 置为 Thread-2,Monitor中只能有一 个 Ow...原创 2022-05-29 22:49:45 · 610 阅读 · 0 评论 -
线程安全问题产生的原因
临界区 Critical Section: 一个程序运行多个线程本身是没有问题的 问题出在多个线程访问共享资源 多个线程读共享资源其实也没有问题 在多个线程对共享资源读写操作时发生指令交错,就会出现问题 一段代码块内如果存在对共享资源的多线程读写操作,称这段代码块为临界区 static int counter = 0;static void increment() // 临界区{ counter++;}static原创 2022-05-28 00:18:21 · 587 阅读 · 2 评论