synchronized void setA() throws Exception{ Thread.sleep(1000); setB(); } synchronized void setB() throws Exception{ Thread.sleep(1000); }
区别java
static synchronized方法是类锁,synchronized方法是对象锁算法
synchronized至关于 this.synchronized,static synchronized至关于Something.synchronized编程
pulbic class Test(){ public synchronized void A(){} public synchronized void B(){} public static synchronized void cA(){} public static synchronized void cB(){} }
新建两个实例,x和y数组
1 x.A()与x.B() 2 x.A()与y.A() 3 x.cA()与y.cB() 4 x.A()与Test.cA()
四种状况哪组方法何以被多个以上线程同时访问?并发
Lock是一个接口函数
public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); Condition newCondition(); }
lock()
、tryLock()
、tryLock(long time, TimeUnit unit)
和lockInterruptibly()
是用来获取锁的。unLock()
方法是用来释放锁的。lock()
日常使用得最多的一个方法,就是用来获取锁。若是锁已被其余线程获取,则进行等待。性能
使用Lock必须在try{}catch{}
块中进行,而且将释放锁的操做放在finally
块中进行,以保证锁必定被被释放,防止死锁的发生。this
Lock lock = ...; lock.lock(); try{ //处理任务 }catch(Exception ex){ }finally{ lock.unlock(); //释放锁 }
tryLock()
tryLock()
有返回值的,它表示用来尝试获取锁,若是获取成功,则返回true,若是锁已被其余线程获取,则返回false。线程
这个方法会当即返回,在拿不到锁时也不会一直在那等待。设计
Lock lock = ...; if(lock.tryLock()) { try{ //处理任务 }catch(Exception ex){ }finally{ lock.unlock(); //释放锁 } }else { //若是不能获取锁,则直接作其余事情 }
tryLock(long time, TimeUnit unit)
此方法在拿不到锁时会等待必定的时间,在时间期限以内若是还拿不到锁,就返回false。若是若是一开始拿到锁或者在等待期间内拿到了锁,则返回true。
lockInterruptibly()
方法比较特殊,当经过这个方法去获取锁时,若是线程正在等待获取锁,则这个线程可以响应中断,即中断线程的等待状态。也就使说,当两个线程同时经过lock.lockInterruptibly()
想获取某个锁时,倘若此时线程A获取到了锁,而线程B还在等待,那么对线程B调用threadB.interrupt()方法中断线程B的等待过程。
lockInterruptibly()
当经过lockInterruptibly()方法获取某个锁时,若是不能获取到,只有进行等待的状况下,是能够响应中断的。
而用synchronized修饰的话,当一个线程处于等待某个锁的状态,是没法被中断的,只有一直等待下去。
当一个线程获取了锁以后,是不会被interrupt()方法中断的。单独调用interrupt()方法不能中断正在运行过程当中的线程,只能中断阻塞过程当中的线程。
lockInterruptibly()
的声明中抛出了异常,因此lock.lockInterruptibly()
必须放在try块中或者在调用lockInterruptibly()
的方法外声明抛出InterruptedException。
public void method() throws InterruptedException { lock.lockInterruptibly(); try { //..... } finally { lock.unlock(); } }