首页 > 编程语言 >[Java]Java初学之多线程05--Lock锁

[Java]Java初学之多线程05--Lock锁

时间:2023-10-29 11:34:43浏览次数:28  
标签:Java 05 -- lock ReentrantLock Lock new 多线程

Intro

除了synchronized关键字,从JDK5.0开始,Java提供了更强大的线程同步机制--通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当。
本文简单讲一下Lock锁的概念以及简单应用。

正文

其实理解了synchronized关键字后,Lock锁的理解就会变得简单起来。
Lock锁实际上是使用了java.util.concurrent.locks这个接口中的ReentrantLock(可重入锁)类来实现Lock。
ReentrantLock拥有Synchronized相同的并发性和内存语义。
下面我们还是用抢票来举个栗子:

package com.multiThread;
import java.util.concurrent.locks.ReentrantLock;

public class TestLock {
	public static void main(String args[]) {
		TestLock2 testLock2 = new TestLock2()
		
		new Thread(testLock2).start();
		new Thread(testLock2).start();
		new Thread(testLock2).start();

	}
}

class TestLock2 implements Runnable {
	int ticketNums = 10;
	//定义Lock锁
	private final ReentrantLock lock = new ReentrantLock();
	@Override
	public void run() {
		while (true) {
			try {
				lock.lock();
				if (ticketNums > 0) {
					System.out.println(ticketNums--)
				}else {
					break;
				}
			}finally {
				//解锁
				lock.unlock();
			}
		}
	}
}

可以看到,只需要在开始处加上lock.lock()锁,然后在结尾lock.unlock()解锁即可

总结一下,Synchronized 和 Lock对比:

  1. Lock是显式锁(手动开启和关闭),synchronized是隐式锁,出了作用域自动释放
  2. Lock只有代码块锁,synchronized有方法锁和代码块锁
  3. 用Lock锁,JVM将用较少的时间来调度线程,性能更好。并且具有更好的可扩展性(提供更多的子类)
  4. 使用的推荐优先顺序:Lock > Synchronized代码块锁 > Synchronized方法锁

标签:Java,05,--,lock,ReentrantLock,Lock,new,多线程
From: https://www.cnblogs.com/zoexcode/p/17795653.html

相关文章

  • 无代码平台的表单平台 JAVA开源项目 毕业设计
    https://gf.bilibili.com/item/detail/1104045029为了帮助小白入门Java,博主录制了本项目配套的《项目手把手启动教程》,希望能给同学们带来帮助。一、摘要基于Vue+SpringBoot+MySQL的无代码平台的表单平台,包括了系统数据中心模块,用来存放管理系统通用的模块,另外分别设计了动态类型......
  • 高校大学生创业管理系统 JAVA开源项目 毕业设计
    https://gf.bilibili.com/item/detail/1104046029为了帮助小白入门Java,博主录制了本项目配套的《项目手把手启动教程》,希望能给同学们带来帮助。一、摘要基于Vue+SpirngBoot+MySQL的高校大学生创业管理系统,拥有系统公告、创业项目、创业社团、创业政策模块,以Vue.js为前端,Spring......
  • 大学计算机课程管理平台 JAVA开源项目 毕业设计
    https://gf.bilibili.com/item/detail/1104047029为了帮助小白入门Java,博主录制了本项目配套的《项目手把手启动教程》,希望能给同学们带来帮助。一、摘要1.1项目介绍大学计算机课程管理平台包含实验课程模块、实验资源模块、学生实验模块,前端采用Vue.js,采用ViewUI组件库美化界面......
  • 高校学生管理系统 JAVA开源项目 毕业设计
    https://gf.bilibili.com/item/detail/1104089029为了帮助小白入门Java,博主录制了本项目配套的《项目手把手启动教程》,希望能给同学们带来帮助。一、摘要基于Vue+SpringBoot+MySQL的高校学生管理系统包含学院课程模块、学生选课模块、课程补考模块,还包含系统自带的用户管理、部门......
  • 厦门旅游电子商务预订系统 JAVA开源项目 毕业设计
    https://gf.bilibili.com/item/detail/1104090029为了帮助小白入门Java,博主录制了本项目配套的《项目手把手启动教程》,希望能给同学们带来帮助。一、摘要基于Vue+SpringBoot+MySQL的厦门旅游电子商务预订系统包含景点类型模块、景点档案模块、景点评分模块、景点收藏模块、酒店模......
  • java 数组浅拷贝与深拷贝
    publicclassdemo{publicvoidfunc(int[]nums){int[]tempNums=newint[]{1,1,1,1,1,1};//浅拷贝//nums=tempNums;//深拷贝for(intj=0;j<nums.length;j++){nums[j]=tempNums[......
  • Java21的新表达式类型-模板表达式
    大家好,我是老七,点个关注吧,将持续更新更多精彩内容!在Java编程语言里,模板表达式这个新玩意儿给大家带来了全新的表达式类型。这篇文章会给大家详细讲解模板表达式是什么,如何用它,以及通过具体的代码示例来展示它的优点。什么是模板表达式模板表达式是Java21里新出的一个表达式类型。它......
  • 手把手教你:如何用Java多线程模拟银行叫号服务
    大家好,我是小米!今天,我将和大家一起探讨一个非常有趣的话题——Java多线程模拟银行叫号服务。这不仅是一个有趣的编程练习,还可以帮助我们更好地理解多线程编程和并发控制。在这篇文章中,我将带领大家一步步实现一个模拟银行叫号服务系统,包括三个窗口、按叫号顺序依次到窗口服务、每个......
  • Java 基础篇day01
    使用你正在使用的语言输出HelloWord!这是振奋人心的一节课,你的码农人生从此处开始。这里是一切的开始,少年。Java是一门高级编程语言,电脑无法直接识别,需要先将java文件编译成class字节码文件,电脑才可以识别。(使用javac编译命令,java运行)我们可以用现在市场上的主流Java编辑器ID......
  • JavaScript复习——02
    代码块写法:{}使用代码块,可以对代码进行分组,同一个代码块中的代码就是同一组代码,一个代码块中的代码,要么都执行,要么都不执行let和var的区别在JS中,let声明的变量具有块级作用域var声明的变量,不具有块级作用域var声明的变量会将变量的声明提至最前对象原始值只能表示......