在单线程程序中,每次只做一件事情,后面的事情需要等待前面这件事情完成才可以进行

如果是多线程程序,这件事情还没做完就又做另外一件事情,这就可能发生两个线程抢占资源的问题

例如:a与b两个人都要去洗手间,洗手间只有一个位置,a还没出来,b就已经进去了,这就很尴尬。。。

Java提供了线程同步的机制来防止资源访问的冲突,实际上线程安全问题来源于多个线程同时对同一对象的操作

例如:下面的代码是火车票的售票功能,当票数小于等于0时停止售票

package java18;

public class ThreadSafe implements Runnable{
    int num = 10;
    @Override
    public void run() {
        while(true)
        {
            if(num>0)
            {
                try {
                    Thread.sleep(100);
                }catch(Exception e) {
                    e.printStackTrace();
                }
                System.out.println("tickets"+num--);
            }
        }
    }
    public static void main(String[] args)
    {
        ThreadSafe t = new ThreadSafe();
        Thread tA = new Thread(t);
        Thread tB = new Thread(t);
        Thread tC = new Thread(t);
        Thread tD = new Thread(t);
        tA.start();
        tB.start();
        tC.start();
        tD.start();
    }

}
这个代码运行后输出的票数num会出现负数(-1,-2),这是为什么呢?

原因在此:,例如:现在num为1,当tA执行时,观察到num>0,售出票,执行sleep,还没有来得及对num进行自减操作,tB发现num现在是1,于是也执行售出票的操作,这就剩一张票,却卖出了两次,出现了问题。

那么有什么办法解决这个问题呢?Java中提供了同步机制

例如:a与b现在又去这个洗手间,a进去以后把门给锁了,b想进去也打不开门,只能等a出来再进去

package java18;

public class ThreadSafe implements Runnable{
    int num = 10;
    @Override
    public void run() {
        while(true)
        {
            synchronized(""){if(num>0)  
            {
                try {
                    Thread.sleep(100);
                }catch(Exception e) {
                    e.printStackTrace();
                }
                System.out.println("tickets"+num--);
            }
        }}
    }
    public static void main(String[] args)
    {
        ThreadSafe t = new ThreadSafe();
        Thread tA = new Thread(t);
        Thread tB = new Thread(t);
        Thread tC = new Thread(t);
        Thread tD = new Thread(t);
        tA.start();
        tB.start();
        tC.start();
        tD.start();
    }

}

Java--线程同步相关推荐

  1. java线程 同步与异步 线程池

    1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有时为了解 决此问题,优先考虑 ...

  2. (转) Java线程同步阻塞, sleep(), suspend(), resume(), yield(), wait(), notify()

    为了解决对共享存储区的访问冲突,Java 引入了同步机制.但显然不够,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了的资源也可能不止一个. 为解决访问控制问题,Java ...

  3. 关于java线程同步的笔记_线程同步(JAVA笔记-线程基础篇)

    在多线程应用程序中经常会遇到线程同步的问题.比如:两个线程A.线程B可能会 "同时" 执行同一段代码,或修改同一个变量.而很多时候我们是不希望这样的. 这时候,就需要用到线程同步. ...

  4. java线程同步——条件对象+synchronized 关键字

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程同步--条件对象+synchronized 关键字 的相关知识: 0.2)for ...

  5. java线程同步——竞争条件的荔枝+锁对象

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程同步--竞争条件的荔枝+锁对象 的相关知识: 0.2) for full sou ...

  6. Java线程同步-模拟买票

    文章首发于 2020-11-29 知乎文章:Java线程同步-模拟买票 作者:落雨湿红尘(也是我o) 01 导语 本文使用JAVA代码模拟买票场景下的业务交互,通过示例讲解线程的初始化.线程同步等ja ...

  7. Java --- 线程同步和异步的区别

    1. Java 线程 同步与异步 多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有 ...

  8. Java线程同步的几种方式

    Java线程同步的几种方式 1.使用synchronized关键字  它的工作是对同步的代码加锁,使得每一次只能有一个线程进入同步块,从而保证线程间的安全性.  synchronized关键字的用法: ...

  9. java线程同步原理

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

  10. Java线程--同步和异步的区别

    本文转自https://blog.csdn.net/u011033906/article/details/53840525 1. Java 线程 同步与异步 多线程并发时,多个线程同时请求同一个资源, ...

最新文章

  1. TCP通信速率与延时关系
  2. 构建布局良好的windows程序
  3. elasticsearch Insert 插入数据和delete 删除数据(Java)
  4. api laravel 统一返回方法_Laravel API 错误处理:当异常时,如何返回消息
  5. 秒级启动万个容器,探秘阿里云容器镜像加速黑科技
  6. 安卓开发 登录用户信息缓存_在Linux上使用finger命令查询登录用户信息
  7. 基于STM32的波形发生器
  8. 英特尔再现安全漏洞:2011年后计算机几乎全中枪,可窃取你的密码及数据
  9. 关于layui中lay-verify=required无效的解决办法
  10. nginx 启动失败 80端口被占用
  11. SAS下载高频数据脚本
  12. Visio-Cisco-华为-IBM网络设备官方模板
  13. layui树形组件渲染
  14. 小游戏上传分数是怎么实现的_如何利用微信小游戏做公众号吸粉营销活动
  15. 保卫萝卜迅玩版53关php,2018微信保卫萝卜迅玩版第50关攻略
  16. pytorch训练FER2013模型
  17. Java架构师和java工程师的区别是什么?架构师薪资是多少?
  18. 文件中的EOF是什么
  19. Selenium安装流程
  20. python英文字母转特定数字_用python实现英文字母和相应序数转换的方法

热门文章

  1. LeetCode 846. 一手顺子(map)
  2. 【机器学习】sklearn数据特征预处理:归一化和标准化
  3. python中进程创建—fork()
  4. 网站服务器令牌获取,adobe - 获取Adobe Sign访问令牌以进行服务器到服务器身份验证 - 堆栈内存溢出...
  5. linux python命令无反应_Python学习第164课--Linux命令行特殊符号的意义及命令的语法规则...
  6. Linux连接状态为syn_recv,linux 服务器 syn*** 大量SYN_RECV状态处理
  7. python list存储对象_《python解释器源码剖析》第4章--python中的list对象
  8. 中countif函数_countif与countifs:单条件与多条件计数适用场景
  9. 知识图谱论文阅读【十二】【KDD2020】 使用贝叶斯图卷积神经网络推荐精确和多样化项目的框架【看不懂,待续】
  10. 搜索引擎核心技术与算法 —— 词项词典与倒排索引优化