12、synchronized和Lock的使用
1、多并发案例:
一个车站有三个窗口同时卖30张票,每个窗口都有40个人在排队买票,在多线程情况下,不加锁,线程不安全,导致卖票不准确
package com.example.Lock; /**
* 线程就是一个单独的资源类,没有任何附属的操作
*/
public class demo1 {
public static void main( String[] args )
{
//并发:多线程操作同一个资源类,把资源类丢入线程
Ticket ticket = new Ticket(); new Thread(() -> {
for(int i=0;i<40;i++){
ticket.sale();
}
},"A窗口").start(); new Thread(() -> {
for(int i=0;i<40;i++){
ticket.sale();
}
},"B窗口").start(); new Thread(() -> {
for(int i=0;i<40;i++){
ticket.sale();
}
},"c窗口").start();
}
} /**
* 资源类
*/
class Ticket{ //总票数
private int number = 30; //卖票
public void sale(){
if(number>0){
System.out.println(Thread.currentThread().getName()+"卖出了第"+(number--)+"张票,剩余: "+number);
}
}
}
2、使用锁:
解决上面的线程不安全的问题,可以通过加锁的方式
(1)、方式一:synchronized关键字
使用synchronized,在卖票的方法加synchronized关键字,表示对是整个方法范围内对当前对象的加锁
//卖票
public synchronized void sale(){
if(number>0){
System.out.println(Thread.currentThread().getName()+"卖出了第"+(number--)+"张票,剩余: "+number);
}
}
(2)、方式二:Lock接口
使用Lock,一共三步
——》创建锁
——》加锁
——》解锁
/**
* 资源类
*/
class Ticket{ //总票数
private int number = 30; //创建锁
Lock lock = new ReentrantLock(); //卖票
public void sale(){ //加锁
lock.lock(); try {
if(number>0){
System.out.println(Thread.currentThread().getName()+"卖出了第"+(number--)+"张票,剩余: "+number);
}
} catch (Exception e) { }finally{
//解锁
lock.unlock();
} }
}
3、synchronized和Lock的区别:
(1)、synchronized是内置的Java关键字;Lock是一个接口
(2)、synchronized无法判断获取锁的状态;Lock可以
(3)、synchronized会自动释放锁;Lock必须手动释放锁,如果不释放,就会出现死锁
(4)、synchronized多个线程获取同一个锁,其中一个线程已经获取锁,但发生阻塞,其他线程就会一直等待;Lock不一定等待下去
(5)、synchronized是可重入锁,不可以中断的,非公平;Lock也是可重入锁,可以判断锁,默认非公平(可以设置公平)
(6)、synchronized适合锁少量代码同步;Lock适合锁大量同步代码
搜索
复制
12、synchronized和Lock的使用的更多相关文章
- 线程安全、数据同步之 synchronized 与 Lock
本文Demo下载传送门 写在前面 本篇文章讲的东西都是Android开源网络框架NoHttp的核心点,当然线程.多线程.数据安全这是Java中就有的,为了运行快我们用一个Java项目来讲解. 为什么要 ...
- 转:synchronized和LOCK的实现原理---深入JVM锁机制
JVM底层又是如何实现synchronized的? 目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug ...
- JAVA中synchronized和lock详解
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronize ...
- Java synchronized和 Lock 的区别与用法
在分布式开发中,锁是线程控制的重要途径.Java为此也提供了2种锁机制,synchronized和lock.做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方. ...
- 关于synchronized和Lock
原文链接:关于volatile关键字解析,synchronized和Lock参考 深入浅出,解释的非常清楚,有条理~~~ 以下为转载内容: Java并发编程:volatile关键字解析 volatil ...
- 【转载】synchronized 与 Lock 的那点事
最近在做一个监控系统,该系统主要包括对数据实时分析和存储两个部分,由于并发量比较高,所以不可避免的使用到了一些并发的知识.为了实现这些要求,后台使用一个队列作为缓存,对于请求只管往缓存里写数据.同时启 ...
- synchronized 与 Lock 的那点事
最近在做一个监控系统,该系统主要包括对数据实时分析和存储两个部分,由于并发量比较高,所以不可避免的使用到了一些并发的知识.为了实现这些要求,后台使用一个队列作为缓存,对于请求只管往缓存里写数据.同时启 ...
- Java多线程编程(四)—浅谈synchronized与lock
一.共享资源竞争问题 在Java语言的并发编程中,由于我们不知道线程实际上在何时运行,所以在实际多线程编程中,如果两个线程访问相同的资源,那么由于线程运行的不确定性便会在这种多线程中产生访问错误.所以 ...
- synchronized和lock比对
前言:在上面的博客说了synchronized的一些用法,下面我们再来看看lock,这个出现频率也是非常高的一个. 1:获取Lock锁的几种方式 前面说了synchronized有锁对象和锁类对象,当 ...
随机推荐
- .NET 采用 SkiaSharp 生成二维码和图形验证码及图片进行指定区域截取方法实现
在最新版的 .NET 平台中,微软在逐步放弃 System.Drawing.Imaging ,给出的理由如下: System.Drawing命名空间对某些操作系统和应用程序类型有一些限制. 在Wind ...
- Go_gin权限验证
权限管理 Casbin是用于Golang项目的功能强大且高效的开源访问控制库. 1. 特征 Casbin的作用: 以经典{subject, object, action}形式或您定义的自定义形式实施策 ...
- 构造器与this、package、import关键字的使用
构造器一.构造器的作用: 1.创建对象 2.初始化对象的信息 二.说明: 1.如果没有显式的定义类的构造器的话,则系统默认提供一个空参的构造器 2.定义构造器的格式:权限修饰符 类名(形参列表){} ...
- Pytorch模型量化
在深度学习中,量化指的是使用更少的bit来存储原本以浮点数存储的tensor,以及使用更少的bit来完成原本以浮点数完成的计算.这么做的好处主要有如下几点: 更少的模型体积,接近4倍的减少: 可以更快 ...
- 题解 CF803A Maximal Binary Matrix
Luogu codeforces 前言 模拟赛原题.. 好好一道送分被我硬打成爆蛋.. \(\sf{Solution}\) 看了一波数据范围,感觉能 dfs 骗分. 骗成正解了. 大概就是将这个 \( ...
- 九、kubernetes命令行工具kubectl
为了方便在命令行下对集群.节点.pod进行管理,kubernetes官方提供了一个管理命令:kubectl kubectl作为客户端CLI工具,可以让用户通过命令行对Kubernetes集群进行操作. ...
- 看了同事这10个IDEA神级插件,我也悄悄安装了
昨天,有读者私信发我一篇文章,说里面提到的 Intellij IDEA 插件真心不错,基本上可以一站式开发了,希望能分享给更多的小伙伴,我在本地装了体验了一下,觉得确实值得推荐,希望小伙伴们有时间也可 ...
- windows中 mysql 免安装版安装
基本安装 绝对路径中避免出现中文,推荐首选英文为命名条件! 以管理员身份打开命令行,并转到mysql的bin目录下 安装mysql服务 mysqld --install 若出现以下错误,需将缺失的文件 ...
- C#通过unsafe来操作指针
这里不介绍unsafe的理论,这里单单介绍它的用法.如果要了解的更具体,可以看这篇大神的博文:C#通过指针操作图像 先从一个很简单的例子介绍: private void TestInptr() { u ...
- 2022ICPC区域赛参后感悟
第一次参加正式的大类赛事,在某种程度上挺激动的.我呢,可以说是刚步入竞赛一年,在此期间遇见了一些志同道合的朋友,最重要的是遇见了我的队友. 开始前,我幻想过我们小队可以超常发挥,拿取学校中第一个区域赛 ...