Java16-3 单例设计模式下的多线程访问
2018-11-08 本文已影响0人
第二套广播体操
当一个单例设计模式被多线程并发访问时,也会出现安全问题。
懒汉式单例设计模式(推荐使用)
不会因为同步而出现安全问题
有共享数据,但没有多条语句操作只有一个Return
//饿汉式单例设计模式
class Single{
private static final Single SINGLE_INTSTANCE=new Single();
private Single(){}
public static Single getInstance(){
return SINGLE_INTSTANCE;
}
}
class SingleDemo implements Runnable{
@Override
public void run() {
Single.getInstance();//这个单例设计模式会被多线程并发访问
//每个多线程都只能创建一个对象
}
}
public class DanDemo {
public static void main(String[] args) {
Single a1= Single.getInstance();
}
}
懒汉式 延迟加载模式(面试问题)
有多条语句操作 存在安全问题
结局
添加synchronized关键字定义类无法解决判断锁次数过多消耗资源问题
解决通过同步代码块外面套if循环
//懒汉式单例设计模式(面试)
//
class Single1{
private static Single1 s=null;
public static Single1 getInstance() {
if (s == null) {
//Thread-0正常进入 到创建对象时cpu跳转 无法同步
// 此时跳回Thread-0创建对象 再无法进入外部if循环因为s不为null
synchronized (Single1.class) {//锁为字节码对象
if (s == null) {
s = new Single1();
}
}
}
return s;
}
}
class SingleDemo1 implements Runnable{
@Override
public void run() {
Single1.getInstance();//这个单例设计模式会被多线程并发访问
//每个多线程都只能创建一个对象
}
}
public class DanDemo_1 {
public static void main(String[] args) {
Single1 s1=Single1.getInstance();
}
}