先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索【程序职场】关注这个执着的职场程序员。
我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验。

大周末的还是6点起床,起床的第一件事就是打开电脑,因为昨天下班晚,回去看了会书就休息了,本来今天是可以有一个休息时间的,结果项目出了点小意外,还要去加班,你说心塞不心塞。

公众号的文章都是中午时间整理,晚上再编辑发布的,昨天时间太紧,就改成今天早上了。

今天我就像聊一个小知识点,线程同步。

废话不多说,先说概念,小伙伴先想想你的理解。

java线程的同步有一个关键词synchronize从英译过来是 "同时发生"。但其真正的含义和字面意思截然相反。线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行操作,而不是同时进行操作。

使用线程同步的目的:
是让各个线程去排队使用资源,而不是让线程同时去使用资源

概念只是让我们明白这个东西是干什么的,但是怎么做,具体怎么使用需要通过实例来说明。

对于线程同步我们生活中就有一个很好的例子就是买车票.

你看全国这么多人买票,不同的方式是(车站,携程,12306,代理窗口),车票肯定不是无限的,但是怎么做到让票卖出去,不会出现漏卖和空卖,怎么做到车票同步的呢?

1, 不同步

为了对比我们先来看看 如果 不是同步卖票  会出现什么情况?

public class ThreadSyn implements Runnable{
//有5张票
int ticked = 5;
@Override
//重写run()方法
public void run() {
for(int i=ticked;i>0;i--) {
System.out.println(Thread.currentThread().getName() + " sells " + i + " ticket");
}
}
//main方法测试
public static void main(String[] args) {
//实例化Thread对象
ThreadSyn tT = new ThreadSyn();
Thread td1 = new Thread(tT,"火车站");
Thread td2 = new Thread(tT,"携程");
Thread td3 = new Thread(tT,"代理商");
Thread td4 = new Thread(tT,"12306");
//启动线程
td1.start();
td2.start();
td3.start();
td4.start();
}
}
 

输入结果:
火车站 sells 5 ticket
携程 sells 5 ticket
携程 sells 4 ticket
火车站 sells 4 ticket
火车站 sells 3 ticket
火车站 sells 2 ticket
火车站 sells 1 ticket
携程 sells 3 ticket
携程 sells 2 ticket
携程 sells 1 ticket
代理商 sells 5 ticket
代理商 sells 4 ticket
代理商 sells 3 ticket
代理商 sells 2 ticket
代理商 sells 1 ticket
12306 sells 5 ticket
12306 sells 4 ticket
12306 sells 3 ticket
12306 sells 2 ticket
12306 sells 1 ticket

Process finished with exit code 0

结果优点崩溃,一共剩余5张票了,但是四个不同的方式,每一个竟然都能买到5张,这是不是有点乱了。

所以就有了同步的概念,当A在买票的时候,B在等待,A买完以后 系统同步票数,直到C去买票的时候,发现没有票了。

public class ThreadSyn implements Runnable{

    int ticket = 8;
//担任"锁",锁是什么不重要,他只是一把锁
//要求,非空对象
private String mutex = "";
@Override
//重写run()方法
public void run() {
//while循环
while (true) {
synchronized (mutex) {
if(ticket > 0) {
System.out.println(Thread.currentThread().getName()+ " sells " + ticket-- + " ticket.");
}else {
break;
}
}
}
}
//main方法测试
public static void main(String[] args) {
//实例化Thread对象
ThreadSyn tT = new ThreadSyn();
Thread td1 = new Thread(tT,"火车站");
Thread td2 = new Thread(tT,"携程");
Thread td3 = new Thread(tT,"代理商");
Thread td4 = new Thread(tT,"12306");
//启动线程
td1.start();
td2.start();
td3.start();
td4.start();
}
}
 

携程 sells 8 ticket.
携程 sells 7 ticket.
携程 sells 6 ticket.
携程 sells 5 ticket.
携程 sells 4 ticket.
携程 sells 3 ticket.
携程 sells 2 ticket.
携程 sells 1 ticket.

Process finished with exit code 0

结果可以添加了同步后,只卖了现有8张票,买完为止。

本文 Github ( 码云Gitee同步) https://github.com/ProceduralZC/JavaDevGuide/tree/master/code/JavaTheead/ThreadSynchron  已收录,欢迎 star。

我是【尔东双月】一枚执着的职场程序员,微信搜索【程序职场】关注我。别忘了三连啊,点赞、收藏、留言,随意给,我不挑。
知乎号: 程序职场
注:如果文章有任何问题,欢迎毫不留情地指正。

你知道购买车票的原理吗?Java 线程同步的更多相关文章

  1. java 线程同步 原理 sleep和wait区别

    java线程同步的原理java会为每个Object对象分配一个monitor, 当某个对象(实例)的同步方法(synchronized methods)被多个线程调用时,该对象的monitor将负责处 ...

  2. Java线程同步之一--AQS

    Java线程同步之一--AQS 线程同步是指两个并发执行的线程在同一时间不同时执行某一部分的程序.同步问题在生活中也很常见,就比如在麦当劳点餐,假设只有一个服务员能够提供点餐服务.每个服务员在同一时刻 ...

  3. Java线程同步_1

    Java线程同步_1 synchronized 该同步机制的的核心是同步监视器,任何对象都可以作为同步监视器,代码执行结束,或者程序调用了同步监视器的wait方法会导致释放同步监视器 synchron ...

  4. java线程 同步临界区:thinking in java4 21.3.5

    java线程 同步临界区:thinking in java4 21.3.5 thinking in java 4免费下载:http://download.csdn.net/detail/liangru ...

  5. JAVA - 线程同步和线程调度的相关方法

    JAVA - 线程同步和线程调度的相关方法 wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁:wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等 ...

  6. Java线程同步的四种方式详解(建议收藏)

    ​ Java线程同步属于Java多线程与并发编程的核心点,需要重点掌握,下面我就来详解Java线程同步的4种主要的实现方式@mikechen 目录 什么是线程同步 线程同步的几种方式 1.使用sync ...

  7. 从使用到原理学习Java线程池

    线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收. 所 ...

  8. Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析

    1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...

  9. 【转载】从使用到原理学习Java线程池

    线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收. 所 ...

随机推荐

  1. html原生js实现99乘法表

    原生的js实现99乘法表实现选择下拉框颜色,改变背景颜色为选中的颜色 <!DOCTYPE html> <html> <head> <meta charset= ...

  2. 程序员与年龄:四十岁普通开发、三十五岁首席架构、三十岁基层Leader

    最近,有一个词儿特别热门--躺平.有没有人跟你说过:"躺平说起来容易,做起来更容易." 和躺平相对的是另外一个词--内卷,群聊的时候,已经很多次看过草卷起来了.jpg表情包.某些节 ...

  3. pika详解(三)SelectConnection及其他Connection

    pika详解(三)SelectConnection及其他Connection   本文链接:https://blog.csdn.net/comprel/article/details/94661147 ...

  4. Jmeter- 笔记3 - Jmeter录制功能 / 抓包

    http代理服务器录制脚本: 1.新建线程组 2.添加 http代理服务器 元件 3.http代理服务器修改: 1)端口:8899,任意给个无占用的 2)目标控制器:改成刚刚新建的线程组.不改就录制会 ...

  5. 从单一图像中提取文档图像:ICCV2019论文解读

    从单一图像中提取文档图像:ICCV2019论文解读 DewarpNet: Single-Image Document Unwarping With Stacked 3D and 2D Regressi ...

  6. 车载智能HUD

    车载智能HUD 从 HUD 到行车记录仪再到后视镜,最近有不少团队都发布了自己的车载智能硬件. 什么是 HUD? HUD 全称抬头数字显示仪 (Heads Up Display),又叫平视显示系统,简 ...

  7. CUDA 7流简化并发

    CUDA 7流简化并发 异构计算是指有效使用系统中的所有处理器,包括CPU和GPU.为此,应用程序必须在多个处理器上同时执行功能.CUDA应用程序通过在流(按顺序执行的命令序列)中,执行异步命令来管理 ...

  8. TVM源码框架安装方法

    TVM源码框架安装方法 本文提供如何在各种系统上从零构建和安装TVM包的说明.它包括两个步骤: 首先从C++代码中构建共享库(linux的libtvm.so,macOS的libtvm.dylib和wi ...

  9. 77GHz 和24GHz Radar性能解析

    77GHz 和24GHz Radar性能解析 一.77GHz MRR 77GHz MRR Automotive Collision Warning Radar Application MRR – Fo ...

  10. 快手推荐系统及 Redis 升级存储

    快手推荐系统及 Redis 升级存储  借傲腾 补上 DRAM 短板 内容简介: 作为短视频领域的领先企业,快手需要不断导入更先进的技术手段来调整和优化其系统架构,以应对用户量和短视频作品数量的爆炸式 ...