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有锁对象和锁类对象,当 ...
随机推荐
- 微信小程序分享好友,朋友圈
<template> <view> <button open-type="share">发送给好友</button> </vi ...
- MatrixOne从入门到实践02——源码编译
MatrixOne从入门到实践--源码编译 在部署MatrixOne前,我们可能会比较纠结使用哪个版本合适,MatrixOne在github上有各个版本的Releases,包含源码包和适用于Lin ...
- 【番外篇】Rust环境搭建+基础开发入门+Rust与.NET6、C++的基础运算性能比较
前言:突然想打算把Rust作为将来自己主要的副编程语言.当然,主语言还是C#,毕竟.NET平台这么强大,写起来就是爽.缘起:之前打算一些新的产品或者新的要开发的东西,由于没有历史包袱,就想重新选型一下 ...
- web前端一览&jQuery
web前端一览 html:裸体 css:好看的衣服 //通常基于bootstrap魔改 JavaScript:动起来 //通常基于JQuery魔改 jQuer ...
- 2022最新版超详细的Maven下载配置教程、IDEA中集成maven(包含图解过程)、以及导入项目时jar包下载不成功的问题解决
文章目录 1.maven下载 2.maven环境变量的配置 3.查看maven是否配置成功 4.配置文件的修改 5.IDEA集成maven 6.导入项目时jar包下载不成功的问题解决 maven教程: ...
- Vue中、参数传递以及重定向
1.参数传递 关键部分代码 1.参数传递 <router-link :to="{name:'information',params:{id:1}}">用户信息</ ...
- C语言客房管理&酒店管理
#include<iostream> #include<string.h> #include<stdlib.h> #include<iomanip> # ...
- Trino Worker 规避 OOM 思路
背景 Trino 集群如果不做任何配置优化,按照默认配置上线,Master 和 Worker 节点都很容易发生 OOM.本文从 Trino 内存设计出发, 分析 Trino 内存管理机制,到限制与优化 ...
- 二、Celery执行一步任务
二.Celery执行异步任务 2.1.基本使用 创建项目celerypro 创建异步任务执行文件celery_task: import celery import time backend='redi ...
- Python基础之函数:6、异常相关和生成器对象、yield用法、生成器表达式
目录 一.异常常见类型 1.类型错误 2.缩进错误 3.索引错误 4.语法错误 5.属性错误 6.key键错误 二.异常处理语法结构 1.基本语法结构 2.查看错误类型 3.针对不同类型所作措施 4. ...