>代码同步与单例设计模式
饿汉式
class Single
{
private static final Single s = new Single();
private Single(){}
public static Single getInstance(){
return s;
}
}
懒汉式
class Single
{
private staticn Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
s = new Single();
return s;
}
}
懒汉式程序存在的问题:
多个程序共享同一个数据s,并且可能同时操作s
懒汉式程序在执行时延迟加载实例
懒汉式多线程访问时可能出现安全问题
可以通过同步代码块或者同步函数的方式解决,但是比较低效。
但是可以通过双重判断的方式,提高效率。
同步使用的锁为该类所使用的的字节码对象。
双重判断的同步代码块:
public static Single getInstacne()
{
if(s == null)
{
synchronized(Single.class)
{
if(s == null)
s = new Single();
}
}
return s;
}
>同步存在的问题:死锁
同步中嵌套同步,锁却不同,导致不同的程序锁持有的锁不同。
典型的死锁问题事例:
/**
* 典型的例子;
* 双锁嵌套导致各自在请求对方的锁,而无法正确的执行程序
*/
package painting;
/**
* @author 宙斯
*
*/
class Test implements Runnable
{
private boolean flag;
Test(boolean flag)
{
this.flag = flag;
}
public void run ()
{
if(flag)
{
synchronized(MyLock.locka)
{
System.out.println("iflocka");
synchronized(MyLock.lockb)
{
System.out.println("ifLockb");
}
}
}
else
{
synchronized(MyLock.lockb)
{
System.out.println("elselockb");
synchronized(MyLock.locka)
{
System.out.println("elselocka");
}
}
}
}
}
class MyLock
{
static Object locka = new Object();
static Object lockb = new Object();
}
public class DeadLock {
/**
* @param args
*/
public static void main(String[] args) {
Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(new Test(false));
t1.start();
t2.start();
}
}