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个线程执行完成之后,其他线程才能继续执行这段代码。 */

原创粉丝点击