美文网首页
2.1.2实例变量非线程安全

2.1.2实例变量非线程安全

作者: 农家男孩 | 来源:发表于2017-07-02 21:38 被阅读0次

2.1.2实例变量非线程安全

如果多个线程共同访问1个对象中的实例变量,则有可能出现“非线程安全”问题。

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class HasSelfPrivateNum {

    private int num=0;

    public void addI(String username){
        try {
            if (username.equals("a")) {
                num = 100;
                System.out.println("a set over!");
                Thread.sleep(200);
            }else{
                num=200;
                System.out.println("b set over!");
            }
            System.out.println(username+" num="+num);
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
}

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class ThreadA extends Thread{

    private HasSelfPrivateNum numRef;

    public ThreadA(HasSelfPrivateNum numRef){
        super();
        this.numRef=numRef;
    }

    @Override
    public void run() {
        super.run();
        numRef.addI("a");
    }
}

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class ThreadB extends Thread{

    private HasSelfPrivateNum numRef;

    public ThreadB(HasSelfPrivateNum numRef){
        super();
        this.numRef=numRef;
    }

    @Override
    public void run() {
        super.run();
        numRef.addI("b");
    }
}


/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {
    public static void main(String[] args){
       HasSelfPrivateNum numRef=new HasSelfPrivateNum();
        ThreadA threadA=new ThreadA(numRef);
        threadA.start();

        ThreadB threadB=new ThreadB(numRef);
        threadB.start();
    }
}

程序运行结果为:

a set over!
b set over!
b num=200
a num=200

本实验是两个线程同时访问一个没有同步的方法,如果两个线程同时操作业务对象中的实例变量,则有可能会出现“非线程安全”问题。修改HasSelfPrivateNum.java文件如下

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class HasSelfPrivateNum {

    private int num=0;

    synchronized public void addI(String username){
        try {
            if (username.equals("a")) {
                num = 100;
                System.out.println("a set over!");
                Thread.sleep(200);
            }else{
                num=200;
                System.out.println("b set over!");
            }
            System.out.println(username+" num="+num);
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
}

重新运行程序,运行结果为:

a set over!
a num=100
b set over!
b num=200

摘选自 java多线程核心编程技术-2.1.2

相关文章

  • 2.1.2实例变量非线程安全

    2.1.2实例变量非线程安全 如果多个线程共同访问1个对象中的实例变量,则有可能出现“非线程安全”问题。 程序运行...

  • 2.对象及变量的并发访问

    线程安全:获取的实例变量的值是经过同步处理的,不会出现脏读得现象。 非线程安全:多个线程对同一个对象中实例变量进行...

  • 1.2.3非线程安全

    非线程安全 非线程安全主要是指多个线程对同一对象中的同一实例变量进行操作时会出现值被更变、值不同步的情况,进而影响...

  • 《Java多线程编程核心技术_高洪岩 著》读后整理02

    第2章 对象及变量的并发访问 概念 “非线程安全”其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生...

  • Java多线程编程核心技术2——同步

    一. 对象及变量的并发访问 非线程安全会发生在多个线程并发访问同一个对象的实例变量时,会产生脏读,读取到的数据是被...

  • synchronized同步方法

    “非线程安全”其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”,也就是取到的数据...

  • 【设计模式】单例模式

    定义 确保某个类只有一个实例 实现方式 饿汉式加载(线程安全) 等价于 懒汉式加载 非线程安全 线程安全 Doub...

  • iOS多线程—各种线程锁的简单介绍

    线程安全是怎么产生的 比如线程内操作了一个线程外的非线程安全变量,就要考虑线程的安全和同步。 - (void)ge...

  • 二、Java多线程编程 (对象及变量的并发访问)

    非线程安全 多个线程对同一个对象中的实例变量进行并发操作时会出现值被更改、值不同步的情况,进而影响程序的执行流程。...

  • iOS多线程-各种线程锁的简单介绍

    线程安全是怎么产生的 常见比如线程内操作了一个线程外的非线程安全变量,这个时候一定要考虑线程安全和同步。 - (v...

网友评论

      本文标题:2.1.2实例变量非线程安全

      本文链接:https://www.haomeiwen.com/subject/zlyocxtx.html