摘要: 1、双重锁定的由来 在 Java 程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题。比如,下面是非线程安全的延迟初始化对象的示例代码: public class 阅读全文
posted @ 2022-06-16 20:53 Maple~ 阅读(52) 评论(0) 推荐(0) 编辑
摘要: 1、final域的重排序规则 对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。 举 阅读全文
posted @ 2022-06-16 20:53 Maple~ 阅读(42) 评论(0) 推荐(0) 编辑
摘要: 1、锁的释放-获取建立的happens-before关系 锁是并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。 下面是锁释放-获取的示例代码: class MonitorExample { int a = 0; public synchroni 阅读全文
posted @ 2022-06-16 20:52 Maple~ 阅读(35) 评论(0) 推荐(0) 编辑