Java--线程同步
发布日期:2021-04-30 21:04:28
浏览次数:104
分类:精选文章
本文共 1245 字,大约阅读时间需要 4 分钟。
在多线程程序中,如果没有采取适当的同步措施,可能会导致资源竞态,进而引发数据不一致的问题。在本题中,售票功能的实现由于缺少线程同步,导致多个线程在同一时间对票数进行操作,导致票数异常减少。
具体来说,当票数为1时,线程tA执行num--操作时,线程tB可能在tA进入Thread.sleep(100)后立即检查票数,发现仍为1,从而也执行num--操作,导致票数变为0后又继续减1,变为-1。这种情况由于缺乏同步机制导致的多线程竞态问题。
为了解决这一问题,需要在关键资源(此处为票数num)的操作部分加锁保护,使得在同一时间只能有一个线程对资源进行操作。Java的synchronized关键字可以很好地实现这一点。通过将synchronized块包裹在票数减少的操作周围,可以确保每次卖票操作都能获得资源的独占访问权,避免多线程竞态。
以下是修正后的代码:
package java18;public class ThreadSafe implements Runnable { int num = 10; @Override public void run() { while (true) { synchronized (this) { 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将正确地从10逐步减少到0,避免出现负数的情况。
发表评论
最新留言
表示我来过!
[***.240.166.169]2026年06月02日 05时14分04秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
php获取用户真实IP和防刷机制
2023-03-01
php获取网页内容的三种方法
2023-03-01
R-CNN算法优化策略
2023-03-01
PHP规范PSR0和PSR4的理解
2023-03-01
php解析ipa包,获取logo
2023-03-01
R&Rstudio安装各种包
2023-03-02
php设置cookie,在js中如何获取
2023-03-02
php设置socket超时时间
2023-03-02
php设计模式 萨莱 pdf,PHP设计模式 建造者模式
2023-03-02
PHP设计模式之----观察者模式
2023-03-02
php设计模式之装饰器模式
2023-03-02
R&Python Data Science系列:数据处理(5)--字符串函数基于R(一)
2023-03-02
PHP设计模式:观察者模式
2023-03-02
php访问mysql(1)
2023-03-02
php详细学习1
2023-03-02
php语言优劣
2023-03-02
PHP语言最优雅的支付SDK扩展包
2023-03-02
PHP请求https域名发生segment fault段错误
2023-03-02
PHP读写XML文件
2023-03-02
PHP读写XML文件
2023-03-02