有如下程序, 两个线程公用数据, 都会对数据进行更改
public class Test { public static void main(String[] args) { Run run = new Run(50); Thread thread1 = new Thread(run); thread1.start(); Thread thread2 = new Thread(run); thread2.start(); } } class Run implements Runnable { int n; public Run(int n) { this.n = n; } public void run() { for ( ; n > 0; -- n) { System.out.println(Thread.currentThread().getName() + " : " + n); } } } |
输出中会有重复和跳过的数字, 原因都是时间片的轮换出现在构造字符串和输出两步之间造成的, 流程如图:
重复的数字出现原因:
跳过一个数字流程: