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