java开发:java多线程(三):lock方式实现线程同步机制

2023-10-27

java多线程系列文章:
java多线程(一):synchronized 对象锁和类锁的区别
java多线程(二): wait()、sleep()、 join()和yield()区别

这章博客讲解lock如何实现同步机制,比较和synchronized 的区别:

JDK1.5中新增加了ReentrantLock类也能达到synchronized 同样的效果,并且在扩展功能上也更加强大,比如具有嗅探锁定、多路分支通知等功能,而且在使用上也比synchronized更加灵活。

1.使用ReentrantLock实现对象锁:

package lock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Test {
 private  Lock lock = new ReentrantLock();
 public void getMessage() {
		lock.lock();
		try {
			for (int i = 0; i < 10; i++) {
				System.out.println("线程:" + Thread.currentThread().getName()
						+ ",getMessage" + i);
			}
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			lock.unlock();
		}

	}
}

创建Test类, lock.lock()获取对象锁, lock.unlock()释放对象锁

package lock;

public class MyThread extends Thread{
	static Test test = new Test();
	@Override
	public void run() {
	test.getMessage();
	}
}

我们继承Thread类,MyThread拥有一个静态的成员变量Test ,这样做事为了确保不同的线程执行run()的时候都是调用同一个Test对象,最后在主函数中创建俩个线程:

	public static void main(String[] args) {
		MyThread t1 = new MyThread();	
		MyThread t2 = new MyThread();	
	    t1.start();
	    t2.start();
	}

输出结果:

线程:Thread-0,getMessage0
线程:Thread-0,getMessage1
线程:Thread-0,getMessage2
线程:Thread-0,getMessage3
线程:Thread-0,getMessage4
线程:Thread-0,getMessage5
线程:Thread-0,getMessage6
线程:Thread-0,getMessage7
线程:Thread-0,getMessage8
线程:Thread-0,getMessage9
线程:Thread-1,getMessage0
线程:Thread-1,getMessage1
线程:Thread-1,getMe
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java开发:java多线程(三):lock方式实现线程同步机制 的相关文章

  • Java多线程--深入浅出Java多线程

    深入浅出Java多线程 慕课网对应课程 深入浅出Java多线程 Java多线程基础概念 进程 程序 任务 的执行过程 动态性 持有资源 共享内存 共享文件 和线程 线程 线程是系统中最小的执行单元 同一进程中有多个线程 线程共享进程的资源
  • java压缩文件工具类

    java压缩文件的各种方式及速度对比 1使用场景 2 maven依赖 3 压缩文件工具类 4 对比结果查看 1使用场景 开发过程中可能会用到压缩文件的需求 是用什么方式更快呢 本次就对几种常见的压缩方式做一个对比 2 maven依赖 引用c
  • Java开发的打包和分发机制之jar包

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于jar包的相关操作吧 一 什么是jar包 jar包 是Java Archive的缩写 它是一种用于打包Java类 资源文件 库等内容的文件格式 Jar包是一种
  • MCAL介绍及Module Plugin开发流程总结

    Mcal 微控制器抽象层位于AUTOSAR分层模型中BSW最底层 包含内部驱动 可以直接访问微控制器和片内外设 MCAL又可以分为微控制器驱动 存储器驱动 通信驱动和I O驱动四个部分 各部分又由具体的与微控制器硬件相对应的驱动模块组成 如
  • 基于SPI机制和DataX插件热加载破坏双亲委派的思考

    在开始阅读之前请先思考以下两个问题 并希望您能再接下来的文章中找到答案 1 如果我自己实现了一个新的java lang String类 并通过UrlClassLoader加载使用该类 能否覆盖JDK中的 java lang String 2
  • Easyexcel导入导出List类型数据报错:Can not find ‘Converter’ support class Li,的解决方法

    目录 问题分析 解决方法 手动编写List类型转换类 问题分析 Easyexcel默认是不支持List类型数据自动转换的 因此当实体类传递数据为List类型时需要手动编写转换类来实现数据转换 否则会报错 Can not find Conve
  • 版本记录总结

    对构建中使用的版本进行记录
  • 面试题:两个按递增顺序排列的整数数组 nums1 和 nums2合并到nums1中,并递增排序,只允许开辟常量空间!!

    给你两个按递增顺序排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你合并 nums2 到 nums1 中 使合并后的数组同样按 递增顺序 排列 只允许开辟常量空间
  • 了解应用层

    应用层 1 概述 2 应用程序组织方式 2 1 C S方式 2 1 P2P方式 3 动态主机配置协议DHCP 3 1 DHCP工作流程 4 域名系统DNS 4 1 域名结构 4 2 域名分类 4 3 域名服务器 4 3 1 分类 4 4 D
  • 在运行jar包时如何替换jar内变量的值?

    在运行jar包时如何替换jar内变量的值 举个例子 1 问题描述 java程序中定义了变量String vars System getProperty aa String vars1 System getProperty aa test 把
  • IDEA 无法正确install springboot以及其他maven dependency

    java Maven plugins can not be found in IntelliJ Stack Overflow 由于使用了私有的maven仓库 我在 m2 下面设置了setting xml 然后就怎么也没法自动install
  • Springboot +Flowable,DataObject的使用方式

    一 简介 在 Flowable 流程图的绘制过程中 可以编写一个名为 dataObject 数据对象 的元素 这个元素可以指定变量的 id 名称以及数据类型等各种属性 并且在流程实例启动的时候 会自动将 dataObject 元素的信息转换
  • MyBatis-Plus复杂条件查询---Example

    目录 概要 Example 类的使用 1 导入依赖 2 创建 Example 对象 3 设置查询条件 4 设置排序规则 5 执行查询 6 分页查询 总结 概要 tk mybatis mapper entity Example 是 MyBat
  • 如何将jar加入自己的maven本地仓库

    本文介绍如何将本地的jar加入到自己的maven本地仓库中 直接在pom文件引用依赖即可 无需手动添加jar文件 一 检查mvn命令 有同学没有配置过maven环境变量 使用mvn命令时 会提示 mvn 不是内部或外部命令 也不是可运行的程
  • mycat实现mysql读写分离,热切换,集群

    在互联网时代 实现mysql读写分离 热切换 集群能大大提高mysql数据库访问压力 防止数据丢失 使用mycat能帮我们实现这些 我们要实现的是这种架构 1 Mycat能实现数据库的垂直切分和水平切分 这里用户写数据的时候 通过mycat
  • JavaWeb图表插件的小研究

    背景 最近的一个项目中 对数据的统计分析有很大的要求 这就要求有一款很强大的报表 图表插件 因此 组长给分了任务 让我们各自去研究不同的图表插件 用了一两天的时间 对java这块的图表插件做了一个简单的研究 java方向的图报表还是有很多很
  • JavaSE复习:数组

    数组 Array 是多个相同类型数据按一定顺序排列 的集合 并使用一个名字命名 并通过编号的方式 对这些数据进行统一管理 数组的常见概念 数组名 下标 或索引 元素 数组的长度 1 数组本身是引用数据类型 而数组中的元素可以是任何数据类型
  • IDEA集成Git及相关操作详解

    IDEA集成Git 一 环境准备 1 配置Git忽略文件 2 Git程序定位 二 Git集成及相关操作 1 Git本地库初始化 2 文件 或目录 添加暂存区及添加本地库 3 查看历史版本及版本切换 4 创建及切换分支 5 合并分支 一 环境
  • mysql 新版本出现group by 语句不兼容问题

    原文地址 http www cnblogs com anstoner p 6414440 html 注 文中的方式 我只是用了修改sql mode 的方法 其它的未尝试 全文如下 目录 1 具体出错提示 1 1 1 查看sql mode 1
  • Mac系统安装Tomcat、创建Java Web项目并配置Tomcat作为服务器

    mac安装Tomcat tomcat下载链接 https tomcat apache org download 80 cgi 解压 访问http localhost 8080 出现如下页面 说明tomcat启动成功 启动成功之后 记得先执行

随机推荐

  • Qt安卓工程报错:No rule to make target

    Qt编译工程报错 No rule to make target 网上查到的解决方案是这样的 第一种情况 Qt编译工程时候 所有用到的源文件包括头文件和库文件的 总路径长度不能超过190个左右字符 一旦超过 就会提示找不到那个文件 这个可能是
  • 新一代的网络请求库 Httpx

    点击上方 Python学习开发 选择 加为星标 第一时间关注Python技术干货 简介 HTTPX 是最近 GitHub看的到一个比较火的一个项目 根据官网的描述 总结有如下特点 和使用 requests 一样方便 requests 有的它
  • 排序算法(一)冒泡排序,简单选择排序,直接插入排序,希尔排序

    冒泡排序 简单选择排序 直接插入排序是三种复杂度为O n2 的算法 希尔排序在特殊增量序列的时候可以获得复杂度为O n3 2 冒泡排序 1 最简单的排序实现 这里把每个数和这个数之后的每个数比较 大于就交换位置 缺点 多出了很多次没有用的交
  • ros2 bag play

    optional arguments h help show this help message and exit s sqlite3 my read only test plugin my test plugin storage sqli
  • Idea intellij 如何创建多个Maven 模块进行协作?

    第一 根工程 先选择新建一个maven工程 不打勾Create from archetype 直接选择next 填写总的工程名字 这样就可以得到如下的项目 删除src下面的文件 比如现在的项目结构要做成如下形式 LS web admin c
  • 2020年12月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

    C C 编程 1 8级 全部真题 点这里 第1题 数组指定部分逆序重放 将一个数组中的前k项按逆序重新存放 例如 将数组8 6 5 4 1前3项逆序重放得到5 6 8 4 1 时间限制 1000 内存限制 65536 输入 输入为两行 第一
  • 国产免费虚拟化OVM与 OpenStack对比

    OpenStack作为一款全球化的开源软件 需要丰富而强大的技术团队进行深度开发与维护 OVM作为国产免费的虚拟化软件 有开箱即用的优势 不需要二次投入太多成本 下面对两个产品的深度对比 OVM是开箱即用的一站式解决方案 OpenStack
  • Gitee码云如何邀请合作者加入

    问题 在创建了项目之后 想邀请别人加入 始终找不到邀请的入口 解决方案 1 选中项目 2 点击管理 3 项目成员管理 开发者 添加项目成员 邀请用户 4 会有三种不同的邀请方式 随意邀请了
  • 蓝桥杯乘积尾0(分析)

    1 问题描述 如下的10行数据 每行有10个整数 请你求出它们的乘积的末尾有多少个零 5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3
  • Error:java: 错误: 不支持发行版本 5 解决方法(详细)

    使用配置 编译器 idea JDK jdk 13 注意 文章篇幅有点长 若省时间可直接看方法二或者方法三 Error java 错误 不支持发行版本 5 出现原因 本地配置jdk和idea默认的jdk不匹配 方法一 File gt Proj
  • vue脚手架vue-cli的卸载和安装

    若电脑之前已经安装过vue cli了 但是版本过低 比方说当前vue cli的版本为2 9 6 然后我想升级到vue cli的最新版本4 0 5 则需要将旧版本卸载 然后再重新安装 vue cli vue cli vue3 0之前版本使用此
  • PHP对接口执行效率慢的优化

    PHP对接口执行效率慢的优化 造成执行效率低的原因可以由很多方面找原因 从代码层面 代码质量低 执行效率也会有很大影响的 从硬件方面 服务器配置低 服务器配置是基础 这个跑不动肯定慢 从数据量方面 查询数据量过多 sql语句过于繁杂 执行缓
  • 安装yarn

    Install via npm It is recommended to install Yarn through the npm package manager which comes bundled with Node js when
  • c字符串函数sprintf()和snprintf()详解

    sprintf 是个变参函数 定义格式如下 int sprintf char buffer const char format argument 精华显然在于第二个字符串 格式化字符串 1 格式化数字字符串 sprintf最常见的应用之一莫
  • React中如何使用refs

    ref是React中的一种属性 当render函数返回某个组件的实例时 可以给render中的某个虚拟DOM节点添加一个ref属性 如下面的代码所示 html view plain copy print
  • Node学习1

    Node 加载模块 加载内置模块和第三方模块直接require 名字 自定义模块需要加路径 require 加载模块时候会自 动调用被加载模块代码 require永远以module export所指向的对象为准 模块作用域 和函数作用域类似
  • 解决VScode使用git报错:Git: Bad status code: 500

    VS CODE GIT 500 问题处理 pudn com相关错误的处理链接博客 作为记录
  • C++ STL各标准容器使用手册

    原文 http blog csdn net nohackcc article details 8900017 1 vector 内部实现 数组 就是没有固定大小的数组 vector直接翻译是向量的意思 支持操作 begin 取首个元素 返回
  • 第10课 微信小程序数据存储(同步缓存、异步缓存,本地读取缓存):

    第10课 微信小程序数据存储 同 异步缓存 本地读取缓存 同步缓存 wx setStorageSync key value 异步缓存 wx setStorage Object object 同步删除缓存 wx removeStorageSy
  • java开发:java多线程(三):lock方式实现线程同步机制

    java多线程系列文章 java多线程 一 synchronized 对象锁和类锁的区别 java多线程 二 wait sleep join 和yield 区别 这章博客讲解lock如何实现同步机制 比较和synchronized 的区别