首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java多线程 多范例多线程的安全

2012-09-08 
java多线程多实例多线程的安全多线程编程时,要时刻注意着线程安全:变量安全、线程同步一般分为多实例多线程

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


或者:ThreadAsum=15ThreadBsum=23
OK,变量共享安全

?

?

热点排行