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,避免出现负数的情况。

上一篇:【Java4】属性和方法,方法重载,变量分类,可变参数,包
下一篇:【docker1】常用指令,docker-compose

发表评论

最新留言

表示我来过!
[***.240.166.169]2026年06月02日 05时14分04秒