当前位置:网站首页>04-传统的Synchronized锁
04-传统的Synchronized锁
2022-07-26 22:28:00 【Casey·Hu】
3、Lock锁(重点)
用传统的 synchronized
04-传统的Synchronized锁
1. 买票的例子
package com.hkx.demo01;
/** * @program: juc * @description: 买票的例子 * @author: Casey Hu * @create: 2022-07-24 19:11 **/
/*** * 真正多线程的开发 公司中的开发 * 线程就是一个单独的资源类,没有任何附属的操作 * 1.属性 方法 */
public class SaleTicketDemo01 {
public static void main(String[] args) {
new Thread(new MyThread()).start();
}
}
class MyThread implements Runnable{
@Override
public void run(){
}
}
2. 线程就是一个单独的资源类,没有任何附属的操作
Runnable() 属于:函数式接口@FunctionalInterface
匿名内部类 new Runable()
package com.hkx.demo01;
/** * @program: juc * @description: 买票的例子 * @author: Casey Hu * @create: 2022-07-24 19:11 **/
/*** * 真正多线程的开发 公司中的开发 * 线程就是一个单独的资源类,没有任何附属的操作 * 1.属性 方法 */
public class SaleTicketDemo01 {
public static void main(String[] args) {
//并发:多个线程操作同一个资源类,把资源类丢入线程
Ticket ticket=new Ticket(); //资源类
//函数式接口@FunctionalInterface ,jdk1.8之后 lambda表达式 (参数)->{代码}
new Thread(()-> {
//三条线程 操作资源的方法
for (int i=0;i<60;i++){
ticket.sale();
}
},"A").start();
new Thread(()-> {
for (int i=0;i<60;i++){
ticket.sale();
}
},"B").start();
new Thread(()-> {
for (int i=0;i<60;i++){
ticket.sale();
}
},"C").start();
}
}
//资源类 OOP开发
class Ticket{
//属性 和 方法
private int number=50;
//买票的方式
// synchronized 本质 :队列 锁
public synchronized void sale(){
if (number>0){
System.out.println(Thread.currentThread().getName()+"卖出了第"+(number--)+"张票,剩余:"+number);
}
}
}
输出日志:
"D:\Program Files (x86)\Java\jdk1.8.0_144\bin\java.exe" "-javaagent:D:\Program Files (x86)\JetBrains\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar=58815:D:\Program Files (x86)\JetBrains\IntelliJ IDEA 2022.1.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\charsets.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\deploy.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\ext\access-bridge-64.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\ext\cldrdata.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\ext\dnsns.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\ext\jaccess.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\ext\jfxrt.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\ext\localedata.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\ext\nashorn.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\ext\sunec.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\ext\sunjce_provider.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\ext\sunmscapi.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\ext\sunpkcs11.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\ext\zipfs.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\javaws.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\jce.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\jfr.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\jfxswt.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\jsse.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\management-agent.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\plugin.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\resources.jar;D:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\rt.jar;E:\IdeaProjects\juc\juc\target\classes;D:\Maven\repository\org\projectlombok\lombok\1.18.8\lombok-1.18.8.jar" com.hkx.demo01.SaleTicketDemo01
A卖出了第50张票,剩余:49
A卖出了第49张票,剩余:48
A卖出了第48张票,剩余:47
B卖出了第47张票,剩余:46
B卖出了第45张票,剩余:44
B卖出了第44张票,剩余:43
A卖出了第46张票,剩余:45
A卖出了第42张票,剩余:41
A卖出了第41张票,剩余:40
A卖出了第40张票,剩余:39
A卖出了第39张票,剩余:38
A卖出了第38张票,剩余:37
B卖出了第43张票,剩余:42
B卖出了第35张票,剩余:34
B卖出了第34张票,剩余:33
B卖出了第33张票,剩余:32
B卖出了第32张票,剩余:31
B卖出了第31张票,剩余:30
B卖出了第30张票,剩余:29
B卖出了第29张票,剩余:28
B卖出了第28张票,剩余:27
B卖出了第27张票,剩余:26
B卖出了第26张票,剩余:25
B卖出了第25张票,剩余:24
B卖出了第24张票,剩余:23
B卖出了第23张票,剩余:22
B卖出了第22张票,剩余:21
B卖出了第21张票,剩余:20
B卖出了第20张票,剩余:19
B卖出了第19张票,剩余:18
B卖出了第18张票,剩余:17
B卖出了第17张票,剩余:16
B卖出了第16张票,剩余:15
B卖出了第15张票,剩余:14
B卖出了第14张票,剩余:13
B卖出了第13张票,剩余:12
B卖出了第12张票,剩余:11
A卖出了第36张票,剩余:35
A卖出了第10张票,剩余:9
A卖出了第9张票,剩余:8
A卖出了第8张票,剩余:7
A卖出了第7张票,剩余:6
A卖出了第6张票,剩余:5
A卖出了第5张票,剩余:4
A卖出了第4张票,剩余:3
A卖出了第3张票,剩余:2
A卖出了第2张票,剩余:1
A卖出了第1张票,剩余:0
C卖出了第37张票,剩余:36
B卖出了第11张票,剩余:10
进程已结束,退出代码0
Lock锁
Lock 接口

Lock接口的三个实现类
SaleTicketDemo02

公平锁:处理线程公平,先来后到
非公平锁:处理线程不公平,根据CPU资源可以插队(默认非公平锁)
package com.hkx.demo01;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/** * @program: juc * @description: 卖票的例子 * @author: Casey Hu * @create: 2022-07-25 21:55 **/
public class SaleTicketDemo02 {
public static void main(String[] args) {
//并发:多个线程操作同一个资源类,把资源类丢入线程
Ticket2 ticket = new Ticket2(); //资源类
new Thread(() -> {
for (int i = 0; i < 60; i++) ticket.sale();
}, "A").start();
new Thread(() -> {
for (int i = 0; i < 60; i++) ticket.sale();
}, "B").start();
new Thread(() -> {
for (int i = 0; i < 60; i++) ticket.sale();
}, "C").start();
}
}
//Lock
class Ticket2 {
private int number = 50;
Lock lock = new ReentrantLock();
/*** * 1.new ReentrantLock() * 2.lock(); 加锁 * 3.unlock(); 解锁 */
public void sale() {
lock.lock(); //加锁
try {
//业务代码
if (number > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了第" + (number--) + "张票,剩余:" + number);
}
} finally {
lock.unlock(); //解锁
}
}
}
synchronized和Lock 的区别是什么
边栏推荐
- [shader realizes swaying effect _shader effect Chapter 4]
- 大疆智图、CC生产了多份数据,如何合并为一份在图新地球进行加载
- 科研太忙无法顾家?陈婷:人生不能只有一个支点
- Introduction to the use of Jerry downloader forced download tool_ Ac695n696nad14ad15 full range support
- Programmer growth chapter 29: how to motivate employees?
- 1. Configuration environment and project creation
- [2016] [paper notes] differential frequency tunable THz technology——
- MySQL syntax uses detailed code version
- json格式化小工具--pyqt5实例
- Science | University of Washington uses AI and structural prediction to design new proteins
猜你喜欢

Recruit | PostgreSQL database R & D engineers every week, with an annual salary of 60+, high salary for famous enterprises, and challenge yourself!

大疆智图、CC生产了多份数据,如何合并为一份在图新地球进行加载

SQL Basics

Counter attack dark horse: devdbops training, give you the best courses!

HCIA-R&S自用笔记(18)园区网架构基础、交换机工作原理、VLAN原理

Practical project: boost search engine

Science | University of Washington uses AI and structural prediction to design new proteins

Hcia-r & s self use notes (20) VLAN comprehensive experiment, GVRP

Thousands of tiles' tilt model browsing speeds up, saying goodbye to the embarrassment of jumping out one by one

PostgreSQL and Navicat: the backbone of the database industry
随机推荐
Science | 华盛顿大学利用AI和结构预测设计全新蛋白质
18、打开、保存文件对话框使用小记
Do you know the common core types of magnetic ring inductors?
Dynamic memory management and related topics
Hcia-r & s self use notes (19) VLAN configuration and experiment, routing between VLANs
Kt6368a Bluetooth chip development precautions and problem collection - long term update
TypeScript阶段学习
MySQL syntax uses detailed code version
2. Realize the map of navigation bar and battle page
HCIA-R&S自用笔记(20)VLAN综合实验、GVRP
Recruit | PostgreSQL database R & D engineers every week, with an annual salary of 60+, high salary for famous enterprises, and challenge yourself!
2022.7.18-----leetcode.749
JSON formatting gadget -- pyqt5 instance
Dao:op token and non transferable NFT are committed to building a new digital democracy
Typescript stage learning
如何使用数据管道实现测试现代化
Application of workflow engine in vivo marketing automation | engine 03
Part II - C language improvement_ 7. Structure
Silicon Valley class lesson 5 - Tencent cloud object storage and course classification management
Silicon Valley class lesson 6 - Tencent cloud on demand management module (I)