线程安全问题
2017-10-26 16:10
99 查看
public
class ClientGenerator {
private
static volidate Hello helloClient = null;
public
static Hello getHelloClient() {
if
(helloClient == null) { // a
synchronized
(ClientGenerator.class) {
if
(helloClient == null) {
helloClient
= new Hello();
helloClient.init();
// b
}
}
}
return
helloClient;
}
}
这段代码的问题还有一个,刚找到的。
因为我有一句 hello.init(); 也就是说如果线程1 执行到语句 b, 但是没有执行完, 当线程2 过来的时候 执行到a,立即退出。然后线程2会用到Hello类的方法(因为语句b没执行完,Hello里有些属性没有初始化),返回的helloClient就是不完整的,如果线程2用到helloClient的属性的时候,因为线程一还没初始化完,会存在线程安全问题
方案:
线程安全的三个必要条件 原子性 可见性 有序性
么么哒,好开心
class ClientGenerator {
private
static volidate Hello helloClient = null;
public
static Hello getHelloClient() {
if
(helloClient == null) { // a
synchronized
(ClientGenerator.class) {
if
(helloClient == null) {
helloClient
= new Hello();
helloClient.init();
// b
}
}
}
return
helloClient;
}
}
这段代码的问题还有一个,刚找到的。
因为我有一句 hello.init(); 也就是说如果线程1 执行到语句 b, 但是没有执行完, 当线程2 过来的时候 执行到a,立即退出。然后线程2会用到Hello类的方法(因为语句b没执行完,Hello里有些属性没有初始化),返回的helloClient就是不完整的,如果线程2用到helloClient的属性的时候,因为线程一还没初始化完,会存在线程安全问题
方案:
加个临时变量,完成动作。 在赋值给volatile
Hello tmp = new Hello();tmp.init(); helloClient = tmp;
线程安全的三个必要条件 原子性 可见性 有序性
么么哒,好开心
相关文章推荐
- 线程安全问题
- 局部变量线程安全问题
- 利用数据库唯一约束解决线程安全的一个问题
- 线程安全问题及解决方法
- servlet与Struts action线程安全问题分析!
- servlet线程安全问题
- 多线程中使用静态方法是否有线程安全问题
- 过滤器、监听器、上下文、servlet线程安全问题
- MFC线程安全问题
- JAVA多线程同步的理解,主要论述单例模式的线程安全问题
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- 线程安全问题
- 卖家报名产品店铺活动,活动控制在20个。---线程安全问题
- mvc框架线程安全问题
- java.单例类懒汉式线程安全问题
- 单例模式的线程安全问题
- 线程安全问题
- Java 中线程安全问题
- iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)
- HashMap、Hashtable和ConcurrentHashMap底层实现原理和线程安全问题