《Java多线程编程核心技术(第2版)》 —1.2.10 留意i--与System.out.println()出现的非线程安

举报
华章计算机 发表于 2020/02/08 13:52:45 2020/02/08
【摘要】 本节书摘来自华章计算机《Java多线程编程核心技术(第2版)》 一书中第1章,第1.2.10节,作者是高洪岩。

1.2.10 留意i--与System.out.println()出现的非线程安全问题

在前面章节中,解决非线程安全问题使用的是synchronized关键字,本节将通过案例去细化println()方法与i--联合使用时“有可能”出现的另外一种异常情况,并说明其原因。

创建名称为sameNum的项目,自定义线程MyThread.java代码如下:

package extthread;

 

public class MyThread extends Thread {

 

    private int i = 5;

 

    @Override

    public void run() {

        System.out.println("i=" + (i--) + " threadName="

               + Thread.currentThread().getName());

        //注意:代码i--;单独一行运行

        //被改成在当前项目中的println()方法中直接进行输出

    }

 

}

运行类Run.java代码如下:

package test;

 

import extthread.MyThread;

 

public class Run {

 

    public static void main(String[] args) {

 

        MyThread run = new MyThread();

 

        Thread t1 = new Thread(run);

        Thread t2 = new Thread(run);

        Thread t3 = new Thread(run);

        Thread t4 = new Thread(run);

        Thread t5 = new Thread(run);

 

        t1.start();

        t2.start();

        t3.start();

        t4.start();

        t5.start();

 

    }

 

}

程序运行后还是会出现非线程安全问题,如图1-26所示。

 image.png

图1-26 非线程安全问题继续出现

本实验的测试目的是要说明:虽然println()方法在内部是同步的,但i--的操作是在进入println()之前发生的,所以发生非线程安全问题仍有一定的概率,如图1-27所示。所以,为了防止发生非线程安全问题,推荐使用同步方法。

 image.png

图1-27 println()方法在内部是同步的


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。