获取锁的线程执行完代码,会自动释放锁。线程执行发生异常,jvm会让线程释放锁;lock必须手动去释放锁。
获取锁的时候,使用Synchronized,其他线程必须等待前一个线程释放了锁才能获取;但是lock可以不用一直等待。
使用Synchronized的锁状态不可判断;使用lock可以判断。
参考文章:https://www.cnblogs.com/xuxinstyle/p/9690316.html
问:设计模式是否有了解?能不能讲几种工作中用到?
答:最简单的有单例模式、工厂模式、模板模式、代理模式、发布-订阅模式,装饰者模式。
其中单例模式问到了单例的写法有哪几种,答有两种,懒汉式和饿汉式。然后又问到了有没有安全点的写法,这里回答使用Synchronized关键字。不过关键字加在哪里回答错了,应该是加在new对象的代码块中,我却回答加在方法上,这点面试官还重复问了两次。
经典的双重校验锁的单例模式代码,必须会写,如下:
public class SingleTon{ //1.构造函数私有化 private SingleTon(){}; //2.定义变量 private static volatile SingleTon s = null; //3.提供对外的访问方法 public static SingleTon getSingleTon(){ if (s == null){ synchronized(SingleTon.class){ if(s == null){ s = new SingleTon(); } } } return s; } }