package com.neutron.t04;
/**
* 分析程序的输出
*/
public class T04 implements Runnable {
private int count = 10;
// public /*synchronized*/ void run() {
// count--;
// System.out.println(Thread.currentThread().getName() + " count:" + count);
// }
public synchronized void run() {
// 任何线程要执行下面的代码,必须先拿到this这把锁
count--;
System.out.println(Thread.currentThread().getName() + " count:" + count);
}
/*
返回结果中的1种,因为每次返回结果都可能不一样
Thread-0 count:9
Thread-1 count:9
Thread-2 count:8
Thread-3 count:7
Thread-4 count:6
而我们要的目的是不重复,每次减一
分析上面结果分析问题可能发生的原因:
线程1和线程2执行到run中的count--时,此时count=9,然后打印
线程3、线程4、线程5执行按照我们思考的方式去执行,然后每次正常打印
*/
public static void tm1() {
T04 t04 = new T04();
for (int i = 0; i <= 4; i++) {
new Thread(t04).start();
}
}
public static void main(String[] args) {
// 当run方法没有synchronized修饰时,tm1方法不能得到我们想要的结果
// 当run方法被synchronized修饰时,tm1方法才能得到我们想要的结果
tm1();
}
}
/*
过程解说:
1.如果run方法不加上synchronized的话,那么每个线程执行run方法时,当进行切换的时候,导致共享数据变化超出我们的预估
就会导致各种意想不到的问题发生。
2.当上锁的时候,synchronized的代码块相当于原子操作,当线程拥有这把锁,执行这段代码块的时候是不可能被打断的,原子操作不可拆分。
只有1个线程执行完成之后,其他线程才能继续执行这段代码。
*/
thread04 - synchronized
最新推荐文章于 2022-08-19 15:29:21 发布