Java线程学习实例——采用同步锁,互斥锁与同步锁的区别,synchronized的使用方法

2023-11-11

栗子来源:https://blog.csdn.net/wenzhi20102321/article/details/52524545

首先对java中同步锁与互斥锁进行区分,主要来源于知乎中的大佬总结如下:

1.锁的概念

锁的目的就是避免多个线程对同一个共享的数据并发修改带来的数据混乱。

锁的实现要处理的大概就只有这4个问题:(知乎大宽宽的回答,非本人观点)

  • 谁拿到了锁“这个信息存哪里(可以是当前class,当前instance的markword,还可以是某个具体的Lock的实例)
  • 谁能抢到锁的规则(只能一个人抢到 - Mutex;能抢有限多个数量 - Semaphore;自己可以反复抢 - 重入锁;读可以反复抢到但是写独占 - 读写锁……)
  • 抢不到时怎么办(抢不到玩命抢;抢不到暂时睡着,等一段时间再试/等通知再试;或者二者的结合,先玩命抢几次,还没抢到就睡着)
  • 如果锁被释放了还有其他等待锁的怎么办(不管,让等的线程通过超时机制自己抢;按照一定规则通知某一个等待的线程;通知所有线程唤醒他们,让他们一起抢……)

2.互斥与同步

互斥锁与同步锁的区别:(知乎:chen Kingwen的回答

互斥是通过竞争对资源的独占使用,彼此之间不需要知道对方的存在,执行顺序是一个乱序。
同步是协调多个相互关联线程合作完成任务,彼此之间知道对方存在,执行顺序往往是有序的。

3.java中synchronized实现同步锁

synchronized为java中实现同步锁的关键字,可以以下几种对象、代码块、方法、类

  • 代码块:被修饰的代码块为同步代码块,调用该代码块的对象是同步锁的操作对象
  • 方法:被修饰的方法为同步方法,调用该方法的对象为同步锁的操作对象
  • 静态方法:被static关键字修饰的方法属于类,那同步锁修饰的静态方法自然被操作对象为该类的所有实例对象
  • 类:被修饰的类为同步类,该类的所有实例对象为同步锁的操作对象

4.实例(该实例来源于https://blog.csdn.net/wenzhi20102321/article/details/52524545

使用同步锁及多线程实现模拟三台售票机售出同批次票:

/*
 * 三个售票窗口同时售卖20张票
 * 1.票数使用同一个静态值
 * 2.保证不出现卖出同一个票数,java多线程同步锁
 */
public class Station extends Thread {
	public Station(String name) {
		super(name);//名字就以线程名进行命名
	}
	static int tick=20;//表示这个票数归类所有
	static Object ob="aa";//静态钥匙,值是任意
	public void run() {
		while(tick>0) {
			synchronized(ob) {//synchronized同步锁,以下钥匙aa为同步静态对象,这就解释了为什么定义为Object
				if(tick>0) {
					System.out.println(getName()+"卖出了第"+(21-tick)+"张票");
					tick--;
				}else {
					System.out.println("票卖完了");
				}
			}
			try {
				sleep(1000);
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
		}
	}	
}

调用的主类:


public class Main_class {
	/**
	 * java多线程同步锁的应用
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Station station1=new Station("窗口1");
		Station station2=new Station("窗口2");
		Station station3=new Station("窗口3");
		station1.start();
		station2.start();
		station3.start();														
	}

}

演示结果:

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

Java线程学习实例——采用同步锁,互斥锁与同步锁的区别,synchronized的使用方法 的相关文章

随机推荐

  • Qt断开信号与槽

    关于信号与槽的研究 DisConnect bool QObject disconnect const QObject sender const char signal const QObject receiver const char me
  • git的安装配置与操作

    一 git 安装与配置 1 git 安装 windows 搜索 git for windows linux yum install y git 查看安装完成 git version git help 2 git 配置 A 配置用户信息 每一
  • android使用隐藏api的方法(使用被@hide的api)

    前言 一开始需要说明的是 Google之所以要将一些API隐藏 指加上 hide标记的public类 方法或常量 是有原因的 其中很大的原因就是Android系统本身还在不断的进化发展中 从1 0 1 1到现在即将问世的Android 2
  • 一个web请求在springboot经历了什么

    写了一个MailServiceController接口 在入口处打上断电 debug启动 可以看到 tomcat embed core 9 0 36 jar 1 run 748 Thread java lang 2 run 61 TaskT
  • Python编程之理解对象

    1 python中的函数和类均是对象 体现在以下几方面 1 都可以赋值给一个变量 2 可以添加到集合对象中 3 可以作为参数传递给函数 4 可以当作函数的返回值 如果一个函数没有return语句 则默认返回None 2 type class
  • 什么是用户token(令牌)-- 转

    在目前的互联网或者计算机网络技术中 经常会听到token或者 令牌 这个词 那有没有想过 token或者说令牌到底是什么东西 有什么作用 为什么token的中文翻译是 令牌 其实这个问题也困扰了我很长的时间 长久以来我都是从token的形式
  • 混合开发监听安卓手机物理返回键

    混合开发监听安卓手机物理返回键 在用h5做混合开发过程中由于有个考试考试页面 中途不能退出 退出要添加确认操作 所以需要监听手机的返回操作 不让用户直接通过返回键返回 目前了解到混合开发中有两种方式监听 方式一 监听popstate 用到的
  • 指针式仪表识别读数 Python(已开源数据集)

    目录 一 前言 二 使用方法 1 安装相关的库 2 运行 三 方法说明 MeterDetection类说明 类参数 主函数 self ImgCutCircle 截取表盘区域 滤除背景 self ContoursFilter 对轮廓进行筛选
  • linux下的shell 快捷键

    linux下的shell 快捷键 2011 05 24 14 06 51 转载 标签 杂谈 分类 linux Ctrl p重复上一次命令 Ctrl a跳到第一个字符前 Ctrl x同上但再按一次会从新回到原位置 Ctrl b前移一个字符不删
  • 深度探索C++对象模型(20)——函数语义学(4)——多继承第二基类对虚函数支持的影响、虚继承下的虚函数

    1 多继承第二基类对虚函数支持的影响 子类继承了几个父类 子类就有几个虚函数表 this指针调整的目的就是让对象指针正确的指向对象首地址 从而能正确的调用对象的成员函数或者说正确确定数据成员的存储位置 多重继承下 有几种情况 第二个或者后续
  • ubuntu设置共享文件夹与linux进行文件共享

    1 打开虚拟机设置 选项 共享文件夹 添加一个文件夹路径 这个路径是windows下 的路径 比如说E盘 可以在E盘里面新建一个 share文件夹 然后确定 2 在Linux目录下 cd mnt hgfs E share 就可以看到里面的文
  • NoSQL的概念

    NoSQL概述 发展历程 1 单机MySQL的年代 网站发展之初 网站的访问量基本不会太大 单个数据库完全足够 那个时候基本都是静态网页HTML服务器没有压力 数据量如果太大 一个机器放不下了 B Tree 索引也放不下了 访问量太大 一个
  • yum安装软件时报错libmysqlclient.so.18()(64bit)

    环境 CentOS 7 4 使用阿里yum的网络源 问题 使用yum安装软件时报错 2 postfix 2 10 1 6 el7 x86 64 has missing requires of libmysqlclient so 18 64b
  • PyQt5中为QTextEdit的某些字符单独设置大小和颜色

    QTextEdit支持富文本 因此您可以将css样式与html一起用于QTextEdit中的文本 可以使用不同的样式附加不同的富文本 为方便起见 只需创建一些格式化文本 并将相应的文本传递给python string的format方法来创建
  • [Linux安装软件详解系列]01 安装MySQL8.0

    目录 1 检查有没有安装MySQL 2 安装MySQL8 0 1 下载 rpm文件 2 上传rpm文件到服务器 3 安装rpm文件 4 查看安装好的包 5 安装MySQL 5 启动MySQL 3 本地登录 1 查看默认密码 2 本地登录My
  • 这注定是一场独一无二的旅行——周年纪念日 [form 2022 to 2023]

    啊哈 竟然已经一周年了 还记得自己写了两三篇博客以后 就停写了很久 很久 总是因为各种各样的事情拖沓 直到有一天CSDN轻轻敲醒了我沉睡的心灵 忽然意识到自己好久没写了 也让我去想自己的初衷 为何而写 Why 一直觉得内容创作是一个很酷的事
  • 华为OD机试 Python 查找人名

    描述 有一串由逗号分隔的人名 每个人名可能由一个或多个单词组成 请你设计一个方法 根据指定的前缀串 找出与前缀匹配的人名 前缀串的构造是由人名中每个单词的第一个字母组合而成 输入 一串用逗号分隔的人名 一个前缀串 输出 匹配前缀串的所有人名
  • 吴恩达机器学习之路---logistic regression

    logistic regression 一 Logistic 回归 利用matlib实现 基础版 1 logistic regression数学基础 1 1 此示例为二元分类 二元分类的最终预测结果h为 0 1 为获得此效果 使用sigmo
  • 02-----带宽分析-----码流、分辨率、帧率的概念及如何计算视频带宽

    相关文章 01 带宽分析 下载nmon分析软件 一 码流 分辨率 帧率的概念 1 码流 码流 Data Rate 是指视频文件在单位时间内使用的数据流量 也叫码率或码流率 是视频编码中画面质量控制中最重要的部分 一般我们用的单位是Kb s或
  • Java线程学习实例——采用同步锁,互斥锁与同步锁的区别,synchronized的使用方法

    栗子来源 https blog csdn net wenzhi20102321 article details 52524545 首先对java中同步锁与互斥锁进行区分 主要来源于知乎中的大佬总结如下 1 锁的概念 锁的目的就是避免多个线程