关于i--与System.out.println()联合使用时可能出现的异常情况

探讨了i--与println()方法在多线程环境下可能引发的非线程安全问题,通过示例代码展示了问题的发生及如何通过同步方法解决。
    println()方法与i--联合使用时“有可能”出现异常,虽然println()方法在内部是同步的,但i--的操作却是在进入println()之前发生的,所以有发生非线程安全问题的概率,如图 1-4所示。

这里写图片描述
图 1-4 println内部同步

示例代码如下:

package com.vhqimk.thread;

/*
 * 测试i--与println()联合使用时可能出现异常
 */
public class Test {
    public static void main(String[] args) {
        // 创建一个MyThread对象,并将该对象分别加载到五个线程中并分别给线程命名
        MyThread myThread = new MyThread();
        Thread t1 = new Thread(myThread);
        Thread t2 = new Thread(myThread);
        Thread t3 = new Thread(myThread);
        Thread t4 = new Thread(myThread);
        Thread t5 = new Thread(myThread);

        // 启动五个线程
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
    }
}

class MyThread extends Thread {
    private int i = 5;

    public void run() {

        System.out.println("i=" + (i--) + " threadName=" + Thread.currentThread().getName());
    }
}

运行结果可能出现异常如图 1-5所示
这里写图片描述
图 1-5 出现非线程安全问题
所以,为了防止发生非线程安全问题还应使用同步方法,即在run()方法前最前面加上synchronized,加上之后运行结果如图 1-6所示
这里写图片描述
图 1-6 没有非线程安全问题
**总结:**println()与i–联合使用时可能会出现非线程安全问题,解决方法仍是使用同步方法,即在需要同步的方法前加上关键字synchronized。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值