首页 > 代码库 > 线程会出现什么安全问题

线程会出现什么安全问题

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、ios培训、.Net培训</a>、期待与您
交流!------


线程会出现什么安全问题
单例设计模式:是为了保证对象的唯一性
class Single
{
private static Single s=null;
private Single(){}
public static Single getSingle()
{
if(s==null)
return new Single();
}

}
我们都知道单例设计模式是为了保证对象的唯一性的,但是当该模式被多线程操作的时候就可能会出现问题。
因为当一个线程在执行到if(s==null)语句时,cpu执行权可能会被其他线程抢走,这样该线程已经判断了s==null。
在他再次抢到执行权后,就不会再判断s==null了,而是直接new对象。

那么试想:该线程在等待再次抢到执行权的时候,另一个进程也可能进来执行。那么第二个线程在执行过程中执行权
如果没有被抢走的话,第二个线程是不是判断的s==null为true,从而new对象。这样等第一个线程再次执行的时候又再
次new了对象,那么该对象就不是唯一的了。违背了单例设计模式的原则

Java对多线程的安全问题提供了专业的解决办法:同步

原理:对多条操作共享数据的语句,只能让一个线程都执行完,执行过程中其他线程不可以参与执行,即加锁!

同步的前提:
1,必须要有两个以上的线程
2,必须是多个线程使用同一个锁

同步代码块:使用的锁是一个对象
synchronized(对象)
{
需要同步的代码块
}

同步函数:使用的锁是this

只需要将synchronized关键字放到需要同步的函数上即可
例:public synchroized void ...

静态函数:使用的锁是该函数所在类的字节码文件对象即类名.class

如何找到需要被同步的代码:
哪些代码需要被同步通过三个明确来找到:
1,明确哪些代码是多线程运行代码
2,明确共享数据
3,明确多线程运行代码中哪些语句是操作共享数据的

 

按照以上原则给单例设计加上同步
class Single
{
private static Single s=null;
private Single(){}
public static Single getSingle()
{
if(s==null)
synchronized(Single.class)
{
if(s==null)
return new Single();
}
}

}

 

这样就可以保证线程的安全了,仍然保证了对象的唯一性。
同步的优缺点
好处:解决了多线程的安全问题
弊端:多个线程每次都要判断锁,消耗了资源,加上双重判断可以稍微提高效率。

 

 


------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、ios培训、.Net培训</a>、期待与您
交流!------

线程会出现什么安全问题