多线程以及同步问题

Posted leevanes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程以及同步问题相关的知识,希望对你有一定的参考价值。

1.在单例设计模式中,会出现多线程的同步问题。主要表现在,当使用的是懒汉式单例设计模式来创建对象的时候,若有多个进程同时在执行,则有可能会创建了多个对象,但这个不是单例设计模式应该出现的问题。所以需要使用锁机制来解决。需要注意的是,饿汉式不会出现这个问题。具体代码如下。

 1 class Singleton_lazy{
 2     //懒汉式
 3     private Singleton_lazy(){}
 4     
 5     private static Singleton_lazy INSTANCE = null;
 6     
 7     public static Singleton_lazy getInstance(){
 8         if(INSTANCE == null){                 //在同步代码块的上面加一个判断,若对象不为空,则肯定不需要创建对象了。也就不需要再去通过同步代码块了
 9             synchronized (Singleton_lazy.class) {     //因为是静态的方法,没有办法使用this去作为锁的对象,因此可以使用类名.class
10                 if (INSTANCE == null)
11                     INSTANCE = new Singleton_lazy();
12             }
13         }
14         return INSTANCE;
15     }
16 }

姑且也许可以这么认为,在有判断语句存在的地方,由于多线程是由cpu来控制执行的,时间片的切换可能导致一种不安全的情况,例如

1 boolean flag = false;
2 if(flag == false){
3 ....execute;
4 flag = true;
5 }

 

在这种情况下,第一个线程满足条件进入之后,还没来得及将flag改为true,此时第二条进程已经通过了判断,进入了函数体,导致不安全问题的产生。

 

以上是关于多线程以及同步问题的主要内容,如果未能解决你的问题,请参考以下文章

线程同步-使用ReaderWriterLockSlim类

多线程以及同步问题

通过Lock对象以及Condition对象实现多线程同步

多线程编程

java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)

详解C++多线程