锁使用来控制多个线程访问共享资源的方式,一般来说一个锁能够防止多个线程同时访问一个资源;
有synchronized 和 Lock
synchronized 将锁的获取和释放固话了,只有现获取再释放;
1,Lock 包含了synchronized 不具备的功能;
(1)尝试非阻塞的获取锁:当前线程尝试获取锁,如果这一时刻锁没有被其它线程获取到,则成功获取该锁;
(2)能被中断的获取锁:获取锁的线程能够响应中断,当获取到锁的线程被中断的时候,中断异常会被抛出,同时锁会被释放;
(3)超时获取锁:在指定的时间内获取锁,如果时间到了还没获取到锁,那么就会返回;
2,Condition
任意java 对象都有一组moniter监控方法wait(),wait(long timout),notify(),notifyall()方法,这些方法与synchronized关键字配合可以实现等待/通知模式;
condition 接口也提供了类似object的监视方法,与Lock配合实现等待/通知模式;
Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); /** * 调用该方法 表示当前线程释放掉锁 并在此处等待 */ public void conditionAwait(){ lock.lock(); try { //类似object.wait() 会释放掉当前锁 condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } /** * 其他线程调用该signal(),通知当前线程从wait()中返回,并且返回前已经获取到了锁 */ public void conditionSignale(){ lock.lock(); try { condition.signal(); }finally { lock.unlock(); } }