对象及变量的并发访问-----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
浙公网安备 33010602011771号