对象及变量的并发访问-----synchronized同步(1)-----方法内变量线程安全

一、方法内变量为线程安全

  创建该类实例对象并且多线程调用,此时若是变量在方法内部,则是线程安全。

 1 package service;
 2 
 3 /**
 4  * Created by zhc on 2017/10/10
 5  */
 6 public class HasSelfPrivateNum {
 7 
 8     public void addI(String username) {
 9         try {
10             int num = 0;          /////////////////////////////////变量方法内部
11             if (username.equals("a")) {
12                 num = 100;
13                 System.out.println("a is set over");
14             } else {
15                 num = 200;
16                 System.out.println("b is set over");
17             }
18             System.out.println(username + " num = " + num);
19         } catch (Exception e) {
20             e.printStackTrace();
21         }
22     }
23 }

package extthread;

import service.HasSelfPrivateNum;

/**
 * Created by zhc on 2017/10/10
 */
public class ThreadA extends Thread {
    private HasSelfPrivateNum numRef;
    public ThreadA(HasSelfPrivateNum hasSelfPrivateNum){
        super();
        this.numRef = hasSelfPrivateNum;
    }

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

import service.HasSelfPrivateNum;

/**
 * Created by zhc on 2017/10/10
 */
public class ThreadB extends Thread {
    private HasSelfPrivateNum numRef;
    public ThreadB(HasSelfPrivateNum hasSelfPrivateNum){
        super();
        this.numRef = hasSelfPrivateNum;
    }

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

  线程分别调用结果还是安全的,

package test;

import extthread.ThreadA;
import extthread.ThreadB;
import service.HasSelfPrivateNum;

/**
 * Created by zhc on 2017/10/10
 */
public class Run {
    public static void main(String[] args){
        HasSelfPrivateNum hasSelfPrivateNum = new HasSelfPrivateNum();
        ThreadB t2 = new ThreadB(hasSelfPrivateNum);
        ThreadA t1= new ThreadA(hasSelfPrivateNum);
        t1.start();
        t2.start();
    }
}

结果如下:

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

二、如果变量在方法外部,可能出现如下情况,造成线程不安全

b is set over
a is set over
b num = 100
a num = 100

 

posted on 2017-10-10 10:10  汉成  阅读(306)  评论(0)    收藏  举报

导航