**JAVA** Thread系列二

>代码同步与单例设计模式


饿汉式

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();
	}

}






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值