java多线程 多实例多线程的安全
多线程编程时,要时刻注意着线程安全:变量安全、线程同步
一般分为多实例多线程、单实例多线程
(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();}}
期待的输出为:
ThreadAsum=15
ThreadBsum=23
?
或者:
?
ThreadBsum=18
ThreadAsum=23
?
?
?
但实际输出可能有错误:
比如:
ThreadAsum=23
ThreadBsum=23
或者
?
ThreadBsum=23
ThreadAsum=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
这时保证只会有两种输出结果:
?
?
ThreadBsum=18
ThreadAsum=23
?
?