,JUC之一,接下来的几篇文章会记录java中锁相关的知识点。锁用于控制多个线程访问共享资源的方式。在Lock之前,锁功能是通过synchronized实现的。既然能出现Lock,那肯定是synchronized在某些情况下不能满足。下面对比一下两者的异同:synchronized的实现原理是通过monitorenter/monitorexit两条指令实现的。前一条指令在编译后插入到同步代码块的开头,而后一条指令插入到方法的末尾和异常处。任何对象都有一个监视器与它关联,当和一个监视器一起持有时,它就会被锁定。lock,主要是通过同步器队列(AQS)和park/unpark。发生异常时同步,发生异常时会自动释放锁,不会造成死锁。lock,锁不会自动释放,释放需要显示在finally中。synchronized是否可以打断,不能打断,线程执行必须完成。锁,可以响应中断。是否支持读写锁synchronized,不支持读写锁。lock,可以通过ReadWriteLock实现读写锁。是否可重入synchronized,支持可重入。锁,可以通过ReentrantLock重入。是否可以同步控制多个线程同时访问共享资源,做不到。锁,可以做到。尝试以非阻塞的方式获取synchronized锁,但是如果获取失败,获取失败就会一直阻塞在synchronized块之外。lock,就可以了,tryLock()方法没有获取到就立即返回。获取锁时,指定超时时间synchronized。如果做不到,获取失败会一直阻塞在synchronized块之外。lock,就可以了,tryLock(longtime,TimeUnitunit)方法,超时后返回。最后看一下Lock接口的方法:tryLock()尝试非阻塞地获取锁,调用方法后立即返回。如果获取到锁,则返回true,否则返回false。newCondition()获取等待通知组件,该组件绑定当前锁。当前线程只有在获取到锁后才能调用该组件的wait()方法。调用后,当前线程会释放锁。如果线程通过lockInterruptibly()获取锁失败,就会等待。如果其他线程调用了本线程的interrupt(),则该线程会从中断中返回,即响应中断。
