// synchronized与lock锁的区别
synchronized 可以修饰类、方法、可以给代码块加锁,会自动释放锁
lock 锁需要手动释放
// synchronized可重入锁的意思
可重入性的意思就是在一个同步方法中调用另一个同步方法;现在有两个同步方法m1、m2 而且加的是同一把锁; 你在方法m1中调用m2,首先获得这把锁开始执行m1方法,当你要执行m2时也要获得这把锁,如果这时锁不可重入,那就进入了死锁的状态; 如果可重入,允许你申请,没毛病 问题不大这就叫可重入锁;
// synchronized释放锁的时机
1、当前线程的同步方法、代码块执行结束的时候释放
2、当前线程在同步方法、同步代码块中遇到break 、 return 终于该代码块或者方法的时候释放。
3、出现未处理的error或者exception导致异常结束的时候释放
4、程序执行了 同步对象 wait 方法 ,当前线程暂停,释放锁
// synchronized也会造成死锁
线程死锁时不会释放锁,相当于循环获取对方的锁,线程认为是正常执行并没有异常,所以不会释放
记住产生死锁的四个必要条件
1.一个资源只允许一个进程访问
2.一个进程在访问一个资源的同时,还需要访问其他资源
3.需要被访问的资源正在被其他进程占用
4.占用着需要被访问的资源的其他进程也需要访问这个资源