面试常见问题 死锁代码&单例模式

1.写一个死锁

1)写一个锁类包含两个锁 锁A以及锁B

package cn.itcast.dieLock;

public class MyLock {
	public static Object objA=new Object();//定义两把锁
	public static Object objB=new Object();
}

2)死锁类

package cn.itcast.dieLock;

public class DieLock extends Thread{
	private boolean flag;
	public DieLock(boolean flag){
		this.flag=flag;
	}
	@Override
	public void run() {
		if(flag){
			synchronized (MyLock.objA) {
				System.out.println("if objA");
				synchronized (MyLock.objB) {
					System.out.println("if objB");
				}
			}
		}else{
			synchronized (MyLock.objB) {
				System.out.println("else objB");
				synchronized (MyLock.objA) {
					System.out.println("else objA");
				}
			}
		}
	}
}
3)测试:

package cn.itcast.dieLock;

public class DieLockTest {
	public static void main(String[] args) {
		DieLock d1=new DieLock(true);
		DieLock d2=new DieLock(false);
		d1.start();
		d2.start();
	}
}
2.单例模式的恶汉式:

package cn.itcast.model;

public class SingleModel {
	private SingleModel(){}//私有化
	private static SingleModel model=new SingleModel();//恶汉式一来就new对象
	public static SingleModel getInstance(){
		return model;
	}
	
}
测试:

package cn.itcast.model;

public class SingleTest {
	public static void main(String[] args) {
		SingleModel model = SingleModel.getInstance();
		SingleModel model2 = SingleModel.getInstance();
		System.out.println(model==model2);
	}
}
打印结果:true

3.单例模式的懒汉式只有用到的时候才new对象

package cn.itcast.model;

public class SingleModel2 {
	private SingleModel2(){}
	private static SingleModel2 model=null;//懒汉式 一来的时候不new
	public synchronized static SingleModel2 getInstance(){
		if(model==null){
			model=new SingleModel2();
		}
		return model;
	}
	
}

测试:

package cn.itcast.model;

public class SinlgeMode2Test {
	public static void main(String[] args) {
		SingleModel2 model=SingleModel2.getInstance();
		SingleModel2 mode2 = SingleModel2.getInstance();
		System.out.println(model==mode2);
	}
}
运行结果:true

注意:恶汉式开发的时候使用,因为没有线程安全问题,懒汉式有线程安全的问题,因此面试的时候经常问,但是面试的时候一定要加 同步锁!







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值