thread04
来源:互联网 发布:mac看照片怎么下一张 编辑:程序博客网 时间:2024/06/07 05:03
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个线程执行完成之后,其他线程才能继续执行这段代码。 */
阅读全文
0 0