Java--线程同步

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

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

例如: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();
    }

}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人类使用AI征服太空技术盘点,《星球大战》中的机器人会成为现实吗?

来源:学术头条作者:Thomas Lawrence一说起太空 AI,你脑海中浮现的是这样的角色吗?图 | 电影《星球大战》的AI机器人:C-3PO和R2-D2(来源:starwars.fandom.com)实际上,早在现代计算机问…

springboot jar中没有主清单属性_Spring Boot 常见错误及解决方法

导读Spring Boot 作为 Java 生态中最流行的开发框架,意味着被数以万计的开发者所使用。下面根据我们自身遇到的问题,加上用户提供的一些反馈,来大致梳理下 Spring Boot 的常见错误及解决方法。找不到配置?配置不对?配置…

Leetcode--174. 地下城游戏

一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正…

[jQuery] 判断复选框checkbox是否选中checked

返回值是true/false method 1: $("#register").click(function(){if($("#accept").get(0).checked){alert($("#accept").get(0).checked);}else{alert($("#accept").get(0).checked);}});// 其中accept为复选框的id. 或者可以替换为: …

Nature:2020年10大科学发现

文章来源:新浪探索在2020年即将结束之际,《自然》(Nature)杂志盘点了今年发表的科学新闻和研究观点,从中选出了十项最为重大的科学发现,既包括新冠病毒研究、压力如何导致白发、HIV治疗等医学方面的研究&am…

php mysql上传多张图片_PHP实现一次性多张图片上传功能

原标题:PHP实现一次性多张图片上传功能最近遇到一个需求,就是多张图片上传,按住Ctrl键能选择多张图片一次性上传,上传成功后数据库保存图片的路径及图片原来的文件名。该功能一般在比较成熟的内容编辑器插件中有,今天特…

Leetcode--20. 有效的括号

给定一个只包括 (,),{,},[,] 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示…

【2018.6.7】阶段总结

颓废了好久-.- 不记得从什么时候开始的了吧- 1. 好像是去年初赛翻车?))归于以外好像也是我不对,,,总之很多,,不对的地方吧,,,我,&am…

车联网支持实现无人驾驶的思考

来源:机器学习研究组订阅号/ 导读 /无人驾驶是车辆作为运载工具智能化、网联化发展的核心应用功能,也是车联网、智慧交通产业发展的核心应用服务。网联无人驾驶则是在车辆智能化基础上,通过车联网实现车与车、车与路等的互联和信息交互&#…

mysql的代码需要保存吗_php向Mysql数据库保存数据的代码

php向Mysql数据库保存数据的代码PHP如何向MySQL数据库中写入数据你知道吗?你对PHP向MySQL数据库中写入数据了解吗?下面是小编为大家带来的php向Mysql数据库保存数据的代码,欢迎阅读。php向Mysql数据库保存数据的代码PHP向MySQL数据库中写入数…

Leetcode--150. 逆波兰表达式求值

根据逆波兰表示法,求表达式的值。 有效的运算符包括 , -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存…

简论重大科学发现诞生的时机

来源:秦四清科学网博客。链接地址:http://blog.sciencenet.cn/blog-575926-1263364.html 纵观科学史,几乎每一项重大科学发现诞生的时机需要:(1)当时已具备足够的知识和资料储备;(2&…

数据库接口使用示例

考虑到我们的接口文档可能不是很清晰,昨天对接的时候也发现UI人员对我们的接口逻辑不太理解,所以这里写几个典型范例。虽然对接也快对接完了(逃,但是这样至少免得以后忘记了。 (注:这里的代码都测试过&…

python pip gpl_python pip怎么更新包

1、pip下载安装1.1 pip下载进入https://pypi.python.org/pypi/pip,下载 .tar.gz压缩包1.2 Linux安装pip# tar -xzvf pip-1.5.4.tar.gz 解压# cd pip-1.5.4 进入解压文件# python setup.py install 安装1.3 升级pippython -m pip install…

Leetcode--78. 子集

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 输入: nums [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 思路&…

人工智能皇冠上的明珠:自然语言处理简介、最新进展、未来趋势

来源:图灵人工智能 编辑:TJUNLP 自然语言处理(Nature Language Processing,NLP)被誉为“人工智能皇冠上的明珠”,一方面表明了它的重要性,另一方面也显现出了它的技术难度。本文整理了自然语言…

realloc 用方法

realloc 用方法 void* realloc(void*, n) 根据n的大小,如果n比较小,就沿用原来的内存地址(也就是返回的地址就是原来的地址),在原来地址的内存空间的最后面,加上n大小的内存空间;如果n比较大&am…

Leetcode--90. 子集Ⅱ

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 思路:相比第78题&…

Yoshua Bengio:深度学习的未来需要“探索高级认知的归纳偏置”

来源:AI科技评论 编译:Mr Bear本文介绍了Yoshua Bengio及其学生Anirudh Goyal近期发表的一篇论文,该论文围绕“归纳偏置”概念,展开了对当下人工智能研究现状的讨论,并提出了富有启发性的观点:不同的深度学…

毕业季

真高兴。 一个懦弱了大学四年的人,竟然破天荒地跑去跟喜欢的女孩子表白。 他依然害怕知道结果,但他不后悔。 转载于:https://www.cnblogs.com/can-i-do/p/9164173.html