多线程编程时,要时刻注意着线程安全:变量安全、线程同步
一般分为多实例多线程、单实例多线程
(1):多实例多线程:共享一个变量时,为了保证变量的安全,在线程运行时, 一般通过锁定对象,synchronized ;
例:
public class MyObj {
private int sum = 10;
public void add(int num) {
sum = sum + num;
System.out.println(Thread.currentThread().getName() + "\tsum=" + sum);
}
}
public class MulThreadTest {
public static void main(String[] args) {
final MyObj myObj = new MyObj();
Thread threadA = new Thread("ThreadA"){
public void run(){
myObj.add(5);
}
};
Thread threadB = new Thread("ThreadB"){
public void run(){
myObj.add(8);
}
};
threadA.start();
threadB.start();
}
}
期待的输出为:
ThreadA sum=15
ThreadB sum=23
或者:
ThreadB sum=18
ThreadA sum=23
但实际输出可能有错误:
比如:
ThreadA sum=23
ThreadB sum=23
或者
ThreadB sum=23
ThreadA sum=23
当运行到threadA加5后,被threadB争夺了线程资源,又加了8,之后是23,然后threadA输出,threadB输出···
这时通过锁定当前对象:
public class MyObj {
private int sum = 10;
public void add(int num) {
synchronized(this){
sum = sum + num;
System.out.println(Thread.currentThread().getName() + "\tsum=" + sum);
}
}
}
把共享变量的方法,设置为原子操作,加关键字:synchronized
这时保证只会有两种输出结果:
ThreadB sum=18
ThreadA sum=23
或者:
ThreadA
sum=15
ThreadB
sum=23
OK,变量共享安全