摘要: 在 Java 中,我们可以使用 synchronized 关键字和 CAS 来实现加锁效果。 悲观锁: 对于悲观锁来说,它总是认为每次访问共享资源时会发生冲突,所以必须对每次数据操作加上锁,以保证临界区的程序同一时间只能有一个线程在执行。 synchronized 是悲观锁,尽管随着 JDK 版本的 阅读全文
posted @ 2024-07-19 19:06 n1ce2cv 阅读(20) 评论(0) 推荐(0) 编辑
摘要: public class Test { static int i; public void test() { synchronized (this) { i++; } } } 0 aload_0 1 dup 2 astore_1 // monitorenter 指令在编译后会插入到同步代码块的开始位 阅读全文
posted @ 2024-07-19 18:15 n1ce2cv 阅读(18) 评论(0) 推荐(0) 编辑
摘要: Java 多线程的锁都是基于对象的,Java 中的每一个对象都可以作为一个锁。 类锁,其实就是 Class 对象的锁。 Class 对象是一种特殊的 Java 对象,代表了程序中的类和接口。Java 中的每个类型(包括类、接口、数组以及基础类型)在 JVM 中都有一个唯一的 Class 对象与之对应 阅读全文
posted @ 2024-07-19 15:41 n1ce2cv 阅读(52) 评论(0) 推荐(0) 编辑
摘要: 在 Java 中,关键字 synchronized 可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),同时我们还应该注意到 synchronized 的另外一个重要的作用,synchronized 可保证一个线程的变化(主要是共享数据的变 阅读全文
posted @ 2024-07-19 14:46 n1ce2cv 阅读(28) 评论(0) 推荐(0) 编辑
摘要: volatile 可以保证可见性,但不保证原子性: 当写一个 volatile 变量时,JMM 会把该线程在本地内存中的变量强制刷新到主内存中去; 这个写操作会导致其他线程中的 volatile 变量缓存无效。 volatile 会禁止指令重排 重排序需要遵守的规则: 重排序不会对存在数据依赖关系的 阅读全文
posted @ 2024-07-19 12:41 n1ce2cv 阅读(6) 评论(0) 推荐(0) 编辑