thread04 - synchronized

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值