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

    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/297709.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于X86的助力智慧船载监控系统

船载综合监控系统结合雷达、AIS、CCTV、GPS等探测技术,以及高度融合的实时态势与认知技术,实现对本船以及范围内船舶的有效监控,延伸岸基监控中心监管范围,保障行船安全,为船舶安全管理部门实现岸基可控的数据通信和动…

基于冒泡排序思想的qsort函数的模拟实现

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…

基于JavaWeb+SSM+Vue家政项目微信小程序系统的设计和实现

基于JavaWebSSMVue家政项目微信小程序系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术 2…

c语言:用结构体找出学生年龄|练习题

一、题目 在结构体数组中&#xff0c;输入学生信息&#xff0c;找出学生的年龄。 如图&#xff1a; 二、代码图片【带注释】 三、源代码【带注释】 #include <stdio.h> //设置结构体&#xff0c;结构体有3个变量 struct student { int id; char name[20]; …

【计算机网络】TCP原理 | 可靠性机制分析(一)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程、计算机网络的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…

html5中各标签的语法格式总结以及属性值说明

有关闭标签的元素 a元素 <a href"" target"" title""></a>表格相关元素 table元素&#xff1a;表格标签caption元素&#xff1a;表头thead元素tbody元素&#xff1a;表格主体元素tfoot元素th元素tr元素&#xff1a;行标签td元素&…

P12 音视频复合流——TS流讲解

前言 从本章开始我们将要学习嵌入式音视频的学习了 &#xff0c;使用的瑞芯微的开发板 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_C…

内存 vs 硬盘:固态硬盘代替内存可以工作吗?

使用固态硬盘代替内存可以吗&#xff1f; 答案是​&#xff1a;不可以​。 ​这个问题看似复杂&#xff0c;其实包含很多方面的原因。 一、存储结构方面 固态硬盘和内存在存储结构上就完全不同。 1.1 固态硬盘采用的是3D闪存单元阵列来存储数据 这些存储单元被一层层地堆…

keras,一个超酷的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - keras。 Github地址&#xff1a;https://github.com/keras-team/keras 深度学习已经成为解决各种复杂问题的有力工具&#xff0c;而 Python Keras 是…

基于ssm的智慧社区电子商务系统+vue论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

关于vite的glob坑

我先展示一段代码&#xff1a; /*** function 根据pages路径动态生成路由* param {Array} 基础路由*/ export default function (routes) {const modules import.meta.glob("../pages/**/page.js", { eager: true, import: "default" });const newRoutes…

windows系统安装docker(Hyper-V方式)

文章目录 1 环境准备2 下载3 安装4 替换国内镜像源5 修改镜像存储路径&#xff08;Hyepe-V方式&#xff09; 1 环境准备 ctrlshiftesc查看CPU的虚拟化是否启动 左键单击电脑左下角开始按钮—>点击“设置”—>搜索“Windows功能”—>启用或关闭Windows功能—>勾选H…

吴恩达倾情推荐!28张图全解深度学习知识!

本文约7500字&#xff0c;建议阅读15分钟本文将从深度学习基础&#xff08;01-13&#xff09;、卷积网络&#xff08;14-22&#xff09;和循环网络&#xff08;23-28&#xff09;三个方面介绍该笔记。 吴恩达在推特上展示了一份由 TessFerrandez 完成的深度学习专项课程图&…

JavaWeb 页面上显示中文乱码解决~

你们好&#xff0c;我是金金金。 场景 我正在学习servlet&#xff0c;通过write()方法向页面上写入中文数据&#xff0c;没想到显示的都是?? 乱码&#xff0c;如图 排查 很明显可以看出来页面上显示的是??&#xff0c;我猜想肯定是字符编码的问题&#xff0c;导致乱码 造成…

uniapp点击跳转传对象

目录 传对象传对象传送组件接受组件 最后 传对象 传对象 传送组件 点击传给组件 <view class"dki-tit-edit" click"gotificatedit(item)">编辑 </view>gotificatedit(item){console.log(item,item);let options JSON.stringify(item);uni.…

jetson AGC orin 配置pytorch和cuda使用、yolov8 TensorRt测试

文章目录 1、安装环境1.1、检查系统环境1.2、下载安装pytorch1.3、下载安装torchvision1.3、测试安装是否成功 2、yolov8测试2.1、官方python脚本测试2.2、tensorrt 模型转换2.3、tensorrt c 测试 1、安装环境 1.1、检查系统环境 检查系统环境、安装jetpack版本&#xff0c;执…

关于github最新登录方法

https://blog.csdn.net/freewzx2005/article/details/133956893 通过手机号验证&#xff0c;发现没有国内的手机号选项&#xff0c;尝试了修改网页的办法以及终端方式&#xff0c;都已经阻止了。 1.商店下载微软验证 2.扫描github上的二维码 大概几十秒钟就会刷新一次&#…

每天一杯羊奶,让身体更健康

每天一杯羊奶&#xff0c;让身体更健康 羊奶作为一种天然的健康饮品&#xff0c;越来越受到人们的关注和喜爱。它不仅口感醇厚&#xff0c;营养丰富&#xff0c;而且具有独特的保健功效。今天&#xff0c;小编羊大师带大家详细介绍一下每天喝一杯羊奶对身体的好处。 羊奶中的…

用Redis实现全局唯一ID

全局唯一ID 如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显受表数据量的限制 全局ID生成器&#xff0c;是一种在分布式系统下用来生成全局唯一ID的工具&#xff0c;一般要满足下列特性&#xff1a; 唯一性高可用递增性安全性高性能 为了增加ID的安全性…

看了致远OA的表单设计后的思考

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…