synchronized void method(){
...
}
synchronized(obj){
...
}
不管是synchronized方法,
还是synchronized代码块,
都可以看做在“{”处获取锁,
在"}"处释放锁。
比较下使用synchronized的代码
与显式处理锁的代码。假设存在一个获取锁的
lock方法和一个释放锁的unlock方法。
在方法开头调用lock,在方法结尾调用unlock,
这就和使用了synchronized的代码功能一样了。
如果在调用lock方法和调用unlock方法之间存在return.
那么锁就有可能无法释放。
是不是不设置return语句不就好了?
并不是这样,因为问题并不仅仅在于return语句。
异常处理同样也会一个问题。抛出异常时,锁也可能无法释放。
如果向让一个方法同时成对执行lock()和unlock(),
即”该方法在调用lock后,无论执行什么操作,unlcok都会被调用“
那么可以像下面这样使用finally(也就是最后的意思)
finally的这种用法是Before/After模式(事前/事后模式)的实现方法之一
public class Gate {private int counter = 0;private String name ="Nobody";private String address = "Nowhere";public synchronized void pass(String name,String address){this.counter++;this.name = name;this.address = address;check();}public synchronized String toString(){return "No."+counter+": "+name +", "+address;}private void check(){if(name.charAt(0)!=address.charAt(0)){System.out.println("***** BROKEN *****" +toString());}}
}
package org.example;public class UserThread extends Thread{private final Gate gate;private final String myname;private final String myaddress;public UserThread(Gate gate,String myname,String myaddress) {this.myname = myname;this.gate = gate;this.myaddress = myaddress;}public void run(){System.out.println(myname+" BEGIN");while(true){gate.pass(myname,myaddress);}}
}
public static void main(String[] args) {System.out.println("Testing Gate,hit CTRL+C to exit!");Gate gate = new Gate();new UserThread(gate,"Alice","Alaska").start();new UserThread(gate,"Bobby","Brazil").start();new UserThread(gate,"Chris","Canda").start();}