java多线程中synchronized同步代码块执行问题

2023-11-17

      在高洪岩老师的《java多线程编程核心技术》一书的用同步代码块解决同步方法的弊端一节中(p76页),有这样一句话:“当一个线程访问object的一个synchronized同步代码块时,另一个线程依然可以访问该object对象中的非synchronized(this)同步代码块”。
      我产生一个问题:如果线程A调用object对象中的synchronized同步代码块,线程B调用object对象中的synchronized同步代码块和非同步代码块时,如果A先占用object对象,那么B会跳过synchronized方法,而去执行后边的非同步代码块吗?

所以将书上代码略微修改一下,主要是 Task类。

package com.wang.thread.synblock;

public class Task {
	private String getDate1;
	private String getDate2;
	public  void doLongTimeTask(){
		System.out.println("begin task threadName=" + Thread.currentThread().getName());
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		String privateGetDate1 = "长时间处理任务后从远程返回的值1 threadName=" + Thread.currentThread().getName();
		String privateGetDate2 = "长时间处理任务后从远程返回的值2 threadName=" + Thread.currentThread().getName();
		synchronized (this) {
			System.out.println("执行同步代码块 threadName=" + Thread.currentThread().getName());
			getDate1 = privateGetDate1;
			getDate2 = privateGetDate2;
		}
		{
			System.out.println("执行非同步代码块 threadName=" + Thread.currentThread().getName());
		}
		System.out.println(getDate1);
		System.out.println(getDate2);
		System.out.println("end task threadName=" + Thread.currentThread().getName());
		
    
		
	}
	
	public void doAsyTask(){
    	System.out.println("处理非同步方法 threadName=" + Thread.currentThread().getName());
    }

}

     MyThread1类:

package com.wang.thread.synblock;

public class MyThread1  extends Thread{
    private Task task;
    public MyThread1(Task task){
    	super();
    	this.task = task;
    }
    @Override
    public void run() {
    	// TODO 自动生成的方法存根
    	super.run();
    	CommonUtils.beginTime1 = System.currentTimeMillis();
    	task.doLongTimeTask();
    	CommonUtils.endTime1 = System.currentTimeMillis();
    }
}

    MyThread2类:

package com.wang.thread.synblock;

public class MyThread2 extends Thread {
	private Task task;
	public MyThread2(Task task){
		super();
		this.task = task;
	}
	@Override
	public void run() {
		// TODO 自动生成的方法存根
		super.run();
		CommonUtils.beginTime2 = System.currentTimeMillis();
		task.doLongTimeTask();
		CommonUtils.endTime2 = System.currentTimeMillis();
		task.doAsyTask();
	}

}

Run类:

package com.wang.thread.synblock;

public class Run {
	public static void main(String[] args) {
		Task task = new Task();
		MyThread1 thread1 = new MyThread1(task);
		thread1.start();
		MyThread2 thread2 = new MyThread2(task);
		thread2.start();
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		
		Long beginTime = CommonUtils.beginTime1;
		Long endTime = CommonUtils.endTime1;
		if(CommonUtils.beginTime2 < CommonUtils.beginTime1){
			beginTime = CommonUtils.beginTime2;
		}
		if(CommonUtils.endTime2 > CommonUtils.endTime1){
			endTime = CommonUtils.endTime2;
		}
		System.out.println("耗时:" + ((endTime - beginTime) / 1000));
	}

}

结果:

begin task threadName=Thread-0
begin task threadName=Thread-1
执行同步代码块 threadName=Thread-1
执行非同步代码块 threadName=Thread-1
长时间处理任务后从远程返回的值1 threadName=Thread-1
长时间处理任务后从远程返回的值2 threadName=Thread-1
执行同步代码块 threadName=Thread-0
执行非同步代码块 threadName=Thread-0
长时间处理任务后从远程返回的值1 threadName=Thread-0
长时间处理任务后从远程返回的值2 threadName=Thread-0
end task threadName=Thread-0
end task threadName=Thread-1
处理非同步方法 threadName=Thread-1
耗时:3

通过结果可以看出,在B线程先占用task对象后,A线程只能等A执行完synchronized同步代码块释放锁之后,才能执行synchronized代码块,而不会跳过synchronized代码块而去执行后面的代码。

至于怎么访问对象中的非synchronized(this)代码块,我就不知道了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java多线程中synchronized同步代码块执行问题 的相关文章

  • HTTP 状态 404 - 请求的资源不可用

    在使用 MyEclipse IDE 中的 Tomcat 服务器和 Struts 2 框架时 我遇到了反复出现的问题 我将我的程序作为服务器应用程序运行 当它运行时 默认的index jsp 文件将成功打开 但应用程序的其他过去都不起作用 当
  • 是否可以在 Spring Batch 中结合分区和并行步骤?

    我只是想知道它在 Spring Batch 中可行吗 Step1Step2 流程 gt 流程1 流程2 流程3 Step3 其中每个flow1 gt 划分为 5 个 GridSizeflow2 gt 划分为 5 个 GridSizeflow
  • MP3:一种以毫秒为单位获取任何给定字节位置的位置的方法?

    我创建了一个 servlet 它返回从客户端请求的任何给定字节位置开始的流 来自 MP3 文件 这允许客户端在任何给定字节位置立即开始播放 而无需进行任何本地查找 现在 我有一个滑块可以直观地显示进度 我正在使用当前字节位置来更新滑块 但是
  • 如何在 Eclipse 中用阿拉伯语读写

    我在 eclipse 中编写了这段代码来获取一些阿拉伯语单词 然后打印它们 public class getString public static void main String args throws Exception PrintS
  • java.lang.Class: 在 java 程序中初始化 log4j 属性文件时出错

    我正在尝试使用 log4j 运行独立的 java 程序 但在调试时收到以下消息 控制台上没有 log4j 相关日志 log Logger 1343 java lang Class ERROR in 18b4aac2 有人可以建议这里出了什么
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • 使用 Java 在浏览器中下载 CSV 文件

    我正在尝试在 Web 应用程序上添加一个按钮 单击该按钮会下载一个 CSV 文件 该文件很小 大小仅约 4KB 我已经制作了按钮并附加了一个侦听器 文件也准备好了 我现在唯一需要做的就是创建单击按钮时下载 csv 文件的实际事件 假设 fi
  • 如何将 XMP XML 块序列化为现有的 JPEG 图像?

    我有许多 JPEG 图像 其中包含损坏的 XMP XML 块 我可以轻松修复这些块 但我不确定如何将 固定 数据写回图像文件 我目前正在使用 JAVA 但我愿意接受任何能让这项任务变得容易的事情 这是目标关于 XMP XML 的另一个问题
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • 为什么我在 Mac 上看到“java.lang.reflect.InaccessibleObjectException: Unable to make private java.nio.DirectByteBuffer(long,int)accessibl

    我已经在工作中愉快地构建代码好几天了 但突然我的一个项目 不是全部 失败并出现此错误消息 看看下面的答案吧 我是如何修复它的 起初我用谷歌搜索 看到很多有这个问题的人正在使用 Java 16 但我认为 错误 我正在使用 Java 11 因为
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • Install4j:如何在安装结束时执行命令行 java -jar filename.jar

    在 Intall4j 中 在安装结束时 我只想通过执行如下命令行来初始化某些内容 java jar filename jar 我怎样才能归档这个任务install4j Thanks 将 运行可执行文件或批处理文件 操作添加到 安装屏幕 并设
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • 为什么 BufferedWriter 不写入文件?

    我有这个代码 String strings Hi You He They Tetrabenzene Caaorine Calorine File file new File G words txt FileWriter fWriter Bu
  • Java 推断泛型类型

    我正在寻找类似的推断捕获泛型类型的概念 类似于以下方法片段 但不是捕获泛型类型的类 public
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这

随机推荐

  • _this2.setState is not a function错误解决办法

    编写RN的小伙伴都知道setState是RN最常见的一个函数 但是这个最简单的函数却是经常报错 这一次我们就来解决 this2 setState is not a function这个错误 首先来看一下我的代码 这段代码就是发送一个请求 然
  • 【SpringBoot学习笔记(四)】之扫描Bean,依赖注入,Bean的生命周期,自定义Bean

    本文章由公号 开发小鸽 发布 欢迎关注 老规矩 妹妹镇楼 一 扫描Bean 1 概述 之前 我们通过构造一个IOC容器来获取Bean 每个Bean对象都要添加 Bean注解 当Bean对象比较多的时候非常麻烦 这里我们使用 Componen
  • 解答:Java是如何实现跨平台运行的?

    Java有一个其他语言都没有特点 那就是跨平台 跨平台是什么意思呢 我们首先来看看平台是指什么 平台就是指我们计算机的操作系统 例如 Windows Linux Mac等操作系统 跨平台的意思就是Java程序 在一次编译后 在这些平台上都可
  • JAVA的内存模型

    Java的内存模型决定了一个线程对共享变量的写入何时对其他线程可见 Java内存模型定义了线程和主内存之间的抽象关系 具体如下 共享变量存储于主内存 计算机的RAM 之中 每个线程都可以访问 每个线程都有私有的工作内存或者称为本地内存 工作
  • ug10万能许可证一键安装_优胜UG4.0-UG12.0-许可证一键自动安装下载

    优胜UG许可证自动安装 NX4 0 NX12 0是优胜模具旗下相应模具软件的证书安装程序 压缩包里有对应的版本号选择 xp系统早年的32位也有对应msi exe验证文件 下方有详细说明 推荐给有需要的用户 ysugxkz nx4 0 nx1
  • Jenkins打包部署gitee项目至阿里云ECS服务器

    原文地址 Jenkins打包部署gitee项目至阿里云ECS服务器 BIGTREE whwtree com 所需插件 Git Parameter Plug In插件 Publish Over SSH插件 Gitee Plugin插件 Nod
  • 7-2 jmu-ds-最长数字序列 (20 分)

    输入一个字符串 求该字符串中最长连续数字序列出现的起始位置及其长度 输入格式 输入一个字符串 可包含空格 输出格式 输出内容 最长数字序列起始位置和长度空格隔开 输出尾部不能有空格 输入空串 输出 NULL 输入样例 123ab12345a
  • 【工具篇】IntelliJ IDEA 设置编码格式UTF-8

    系统 Win11 Idea IDEA 2022 3 2 Ultimate Edition 文件编码 Editor gt File Encodings 编译编码 Build Execution Deployment gt Complier g
  • 从微信授权登录到数据安全性的思考总结

    前置知识 微信授权登录过程和相关名词 access token code openid等 微信授权登录 大都是拉起微信授权页面 用户同意授权后 再跳到自己应用的绑定手机页面进行绑定手机的操作 绑定之后自动登录 会话就像不会过期一样 或者是过
  • 基于live555实现实时视频监控

    目录 1 所需软件 源码及下载地址 1 2安装软件及编译 1 2 1 安装Windows版的VLC
  • JavaScript全解析——循环结构语句

    循环控制 控制程序重复执行若干次相同或似的逻辑 理解并正确使用循环控制 需要搞清楚循环的3个要素 起始值 变化量 终止条件 起始值循环的起点 可以是 任意数据类型值 变化量是指 改变起始值的方式 终止条件 布尔类型值 它是循环停止的边界 w
  • springboot多版本管理

    达到的版本控制效果如下 1 api版本定义在url中 采用 api 项目名 pro v4 接口名 的形式 2 api版本号通过注解进行定义 3 如果请求中不指定api版本号则返回最新版本 4 版本的自动适配 如果请求的api版本不存在 则返
  • 详解微信小程序网络请求接口封装

    为实现定制要求和方便调用 对微信小程序的网络请求接口进行了封装 在根目录新建api文件夹并新建httpRequest js与config js文件 1 设置请求域名 设置请求域名 let ENV wxConfig envVersion le
  • the import org.junit.Assert.* cannot be revolved的解决方法

    the import org junit Assert cannot be revolved的解决方法 具体解决方法 右键单击项目名 选择buildpath gt add library 弹出配置对话框 选择junit next下一步 系统
  • python想获取字符串str的长度_如何使用python获取字符串长度?哪些方法?

    掌握多种python技巧 对于我们更好的灵活应用python是非常重要的 比如接下来给大家介绍的获取字节长度 那大家脑海里就该有印象了 有几种方法呢 一起来看下吧 1 使用len 函数 这是最直接的方法 在这里 我们使用len 函数 字符串
  • 【python】将python代码打包成系统可执行文件(Pyinstaller模块)

    python文件打包输出可执行文件 1 Pyinstaller模块下载 2 Pyinstaller的使用 2 1 打开命令行 指引文件路径 2 2 直接生成可执行文件 3 常用指令 3 1 修改图标 3 2 修改名称 3 3 修改路径 1
  • 知识图谱,为移动搜索而生

    核心提示 当你尝试搜索 冰桶挑战 是什么决定你在搜索引擎上看到的内容呢 移动互联网时代 搜索引擎如何才能足够精准 个性化呢 这背后需要一个共同的作用机制 知识图谱 最近 冰桶挑战 挺火的 好奇心驱使我百度一下 看到如下结果 可能是做搜索的职
  • 人脸口罩检测 Python

    随着全球疫情的爆发 佩戴口罩成为了一项重要的健康和安全措施 在这种情况下 开发一个能够自动检测人脸是否佩戴口罩的系统变得非常有用 在本文中 我们将使用 Python 编程语言来实现一个简单的人脸口罩检测系统 首先 我们需要安装一些必要的 P
  • R语言mgarch包的说明_【R语言】优雅的循环迭代:purrr包

    用 R 写 循环 从低到高有三种境界 手动 for 循环 apply 函数族 purrr 包泛函式编程 补充一点 关于purrr 与 apply 族 purrr 提供了更多的一致性 规范性和便利性 更容易记住和使用 速度来说 apply 族
  • java多线程中synchronized同步代码块执行问题

    在高洪岩老师的 java多线程编程核心技术 一书的用同步代码块解决同步方法的弊端一节中 p76页 有这样一句话 当一个线程访问object的一个synchronized同步代码块时 另一个线程依然可以访问该object对象中的非synchr