已采纳回答 / 慕粉4117368
是的,比如要是多线程访问的情况下,很容易,线程一访问到一半,线程二突然插进来执行,所以要加同步处理的机制,防止在线程一执行的情况下,有别的线程抢占进来执行,加上同步就可以使一个线程运行完了,下一个线程才可以拿到cpu的资源继续执行
2017-04-12
并不是我想学习的那种,我想演示一下懒汉怎么出现线程不安全现象,以及如何解决线程不安全,然后单例模式还有几种实现方式,比如说枚举,天然的单例,还能防止反射去绕过安全机制拿到实例
2017-04-11
所谓的懒汉模式线程不安全可以简单的理解为,在A使用这个类的实例的时候,对象正在创建的时候,B也要来使用这个实例,所以不太安全,但是,饿汉模式在类加载的时候就已经创建了对象,A和B可以同时使用这个实例。
2017-04-05
这里讲的线程不安全,主要是在判断是否创建了这个实例的代码块里。楼上很多赞的那个,提到的方法叫双重检查锁定。
问题根源是,instance = new Instance()可以分解成三行伪代码。正常的顺序是分配对象的内存空间->初始化对象->设置instance指向刚分配的内存地址。注意第2.3步会被重排序。这时候instance被分配了内存但是没有初始化。如果这时候有一个线程B来访问,他判断instance!=null后调用这个对象时发现对象没有初始化,就出现bug了~解决方案:1、Instance声明为volatile类型。2、允许重排序,但是重排序不被其他线程看到。
问题根源是,instance = new Instance()可以分解成三行伪代码。正常的顺序是分配对象的内存空间->初始化对象->设置instance指向刚分配的内存地址。注意第2.3步会被重排序。这时候instance被分配了内存但是没有初始化。如果这时候有一个线程B来访问,他判断instance!=null后调用这个对象时发现对象没有初始化,就出现bug了~解决方案:1、Instance声明为volatile类型。2、允许重排序,但是重排序不被其他线程看到。
2017-03-14