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();
}