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

    }

相关推荐

  1. Ansible语法模块

    2024-01-06 20:48:02       5 阅读
  2. synchronized用于静态方法普通方法有区别吗?

    2024-01-06 20:48:02       13 阅读
  3. synchronized使用

    2024-01-06 20:48:02       29 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-06 20:48:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-06 20:48:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-06 20:48:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-06 20:48:02       20 阅读

热门阅读

  1. journalctl -u kubelet 查看指定时间段日志

    2024-01-06 20:48:02       37 阅读
  2. MATLAB --- interp1( )函数的用法

    2024-01-06 20:48:02       36 阅读
  3. AI:103-基于深度学习的海上牧场鱼群识别技术

    2024-01-06 20:48:02       46 阅读
  4. linux 安装minio

    2024-01-06 20:48:02       45 阅读
  5. RabbitMQ 教程

    2024-01-06 20:48:02       45 阅读
  6. 动态选择pc移动端css文件

    2024-01-06 20:48:02       35 阅读
  7. 雅思词汇——Word List 2(V2)

    2024-01-06 20:48:02       29 阅读
  8. ES在工作中的使用

    2024-01-06 20:48:02       42 阅读
  9. python基础教程三(元组和字符串格式化)

    2024-01-06 20:48:02       39 阅读
  10. 机器学习中聚类算法-简单介绍

    2024-01-06 20:48:02       37 阅读