Double-Checked Locking看起来是非常完美的。但是很遗憾,根据Java的语言规范,上面的代码是不可靠的。
出现上述问题,
最重要的2个原因如下:
1, 编译器优化了程序指令, 以加快cpu处理速度.
2, 多核cpu动态调整指令顺序,
以加快并行运算能力.
问题出现的顺序:
1, 线程A, 发现对象未实例化, 准备开始实例化
2, 由于编译器优化了程序指令,
允许对象在构造函数未调用完前, 将共享变量的引用指向部分构造的对象, 虽然对象未完全实例化, 但已经不为null了.
3, 线程B,
发现部分构造的对象已不是null, 则直接返回了该对象.
不过, 一些著名的开源框架, 包括jive,lenya等也都在使用DCL模式,
且未见一些极端异常.
说明,
DCL失效问题的出现率还是比较低的.
接下来就是性能与稳定之间的选择了?
DCL的替代
Initialize-On-Demand
:
public
class Foo {
// 似有静态内部类, 只有当有引用时, 该类才会被装载
private static class
LazyFoo {
public static Foo foo = new
Foo();
}
public static Foo getInstance() {
return
LazyFoo.foo;
}
}
分享到:
相关推荐
针对DCL失效问题,可以通过以下几种方式来解决: 1. **使用枚举单例**:利用枚举类型的天然线程安全性来实现单例模式。 2. **静态内部类**:通过静态内部类的方式实现懒加载,利用Java的类加载机制来保证单例的线程...
由于JMM允许编译器和处理器重排序这些操作,因此在某些情况下,对象可能在没有完全初始化的情况下就对其他线程可见,从而导致DCL失效。 #### 六、结论 Java内存模型是Java并发编程的重要基础。正确理解和应用JMM的...
在上述示例中,虽然表面上看起来可以避免同步带来的性能损失,但由于`new Singleton()`操作并非原子性的,可能造成DCL失效的问题。具体来说,`new Singleton()`涉及到三个步骤: 1. 分配对象内存空间。 2. 初始化...
如果查询不遵循最左前缀法则,范围查询可能导致索引失效。索引的使用应遵循一些原则,例如,使用联合索引可以提高性能并避免回表查询。 在SQL优化方面,批量插入比单条插入更高效,手动提交事务可以减少磁盘I/O。...
- 考虑到序列化和反序列化可能导致单例模式失效,可以重写`readResolve()`方法来解决这个问题。 总的来说,单例模式是一种有效的设计模式,能够有效地管理资源和提供全局访问点,但在使用时需要注意线程安全以及...
文章提到的双重检查锁定(Double-Checked Locking,简称DCL)是一个在单例模式中用来优化性能的编程技巧。该技巧的核心在于减少同步的开销,在多线程环境下,仅在实例未被创建时才同步。然而,这个技巧在Java早期...
为确保线程安全,通常使用双检锁/双重校验锁(DCL,即double-checked locking)或者静态内部类来实现。 5. **组件间的通信**:Activity和服务之间可以通过Intent进行通信,服务可以通过startActivityForResult()...
- 在分布式系统如EJB中,由于跨越服务器和JVM,单态模式可能失效,需要考虑其他设计方案。 - 单态模式使得系统难以扩展,如果需要改变或替换单态对象的行为,可能需要修改代码,这违背了开放封闭原则。 - 如果单态...
在某些情况下,使用DCL语句(如`grant select on table_name to user_name`)可以使特定的执行计划失效,这可能是快速解决问题的策略。不过,最佳实践是避免使用绑定变量,以确保执行计划能够适应各种输入值,然后...
描述部分则强调了在开发人员的角度,需要关注的几个关键点:数据访问类(包括select查询、DML操作、DDL操作),事务控制类和权限控制类(DCL操作)。 从【部分内容】中可以提取以下知识点: 1. SELECT语句的编写...
- **RAID 6**:类似于RAID 5,但是增加了第二个奇偶校验位,从而能够在两个磁盘同时失效的情况下仍然保持数据完整性。 #### Dell PowerEdge RAID控制器概述 Dell PowerEdge系列服务器配备了多种高性能的RAID控制器...
- **数据控制语言(DCL)**: 用于管理和控制数据库权限。 - **事务控制语言(TCL)**: 用于管理事务处理,确保数据的一致性和完整性。 **1.4 DM_SQL所支持的数据类型** - **1.4.1 常规数据类型**: 包括整型、浮点型...
- **数据控制语言(DCL)**:用于管理用户的权限和角色。 - **事务控制语言(TCL)**:用于管理事务,如提交、回滚等。 ##### 1.4 DM_SQL所支持的数据类型 - **1.4.1 常规数据类型** - `NUMERIC`/`DECIMAL`:固定精度...
SQL语言可以分为数据定义语言(DDL)、数据操作语言(DML)和数据控制语言(DCL)三个部分。 3. 在关系数据库中,模式对应的是基本表。模式是数据库的逻辑结构,它定义了数据库的组织方式和数据之间的关系。 4. ...
7. 数据库管理系统的子语言包括数据定义语言(DDL)、数据操纵语言(DML)和数据控制语言(DCL),不包括C语言。 8. 数据是存储在物理符号上的,可以是数字、文字或其他形式。 9. 软件危机表现为软件开发效率低、质量...
3. T-SQL语言:深入学习T-SQL(Transact-SQL),包括DML(数据操作语言)、DDL(数据定义语言)和DCL(数据控制语言)。 三、查询与数据处理 1. 查询基础:学习SELECT语句,掌握如何进行简单的查询、联接、子查询和...
3. DCL(Data Control Language):管理数据库权限,如GRANT、REVOKE等语句。 4. 查询语言:深入理解SELECT语句,包括聚合函数、连接操作、子查询、联接、窗口函数等高级用法。 五、数据库事务与并发控制 1. 事务的...
- DCL(Data Control Language):用于管理数据库权限和安全性,如GRANT、REVOKE等。 3. 关系数据库理论 - 正规化:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及BCNF(Boyce-Codd范式)等。 - 索引...
维修时,我们需要根据原理图逐个排查,例如,检查浪涌吸收器是否损坏,滤波电容是否失效,驱动管是否烧毁,电流检测电路是否正常,以及稳压环节是否工作准确。只有找到故障源并修复,才能恢复系统的正常供电。 总的...