synchronized语法与Before/After模式

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

    }

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值