synchronized语法与Before/After模式

发布时间:2024年01月06日

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

    }

文章来源:https://blog.csdn.net/wcg_jishuo/article/details/135430895
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。