我不知道为什么会出现这些输出,(java线程)

问题描述 投票:0回答:1

输出:

Thread1 Start !! 

Thread2 Start !! 

Thread2 End !! 100001

Thread1 End !! 100001

我认为输出是{1,10001}或{10000,10001}由于同步...

import java.util.*;

public class Main2 {
    public static int shared = 0;
    public synchronized static void sharedIncrease(long amount) {
        while(amount-->0) shared++;
    }
    public static void main(String args[]) throws Exception {
        StrangeThread t1 = new StrangeThread(100000);
        StrangeThread t2 = new StrangeThread(1);
        t1.start();
        t2.start();
    }
}

class StrangeThread extends Thread {
    long amount;
    int thrdNum;
    static int cnt = 1;
    StrangeThread(long value) {
        amount = value;
        thrdNum = cnt++;
    }
    public void run() {
        System.out.println("Thread"+thrdNum+" Start !! ");
        Main2.sharedIncrease(this.amount);
        System.out.println("Thread"+thrdNum+" End !! "+Main2.shared);
    }
}
java multithreading
1个回答
0
投票

请考虑以下操作顺序

  1. 线程1开始。打印Thread1 Start !!
  2. 线程2开始。打印Thread2 Start !!
  3. 线程1获取锁定并执行sharedIncrease中的逻辑(线程2被阻塞)。方法返回时,shared将为100000。
  4. 现在,线程2获取锁并执行。最后,shared将为100001。
  5. 线程2打印Thread2 End !!
  6. 线程1打印Thread1 End !!

56点处,shared的值为100001。(您也可以反转5和6;结果相同)。

关键是线程1在其执行的一部分递增之前无法打印。因此,您会看到相同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.