您的位置:首页 > 其它

用买票例子讲讲多线程安全问题

2014-08-31 23:35 218 查看
在javase中多线程安全问题,买票的例子几乎是都会讲到,今天就以买票的程序来简单分析下java多线程安全问题的产生以及解决方案

先看程序代码:

public class ThreadTest1 {

/**

* @param args

*/

public static void main(String[] args) {

//这是二个线程操作同一个对象 一般都是实现Runnable接口

ThreadDemo t = new ThreadDemo();

Thread t1 = new Thread(t);

Thread t2 = new Thread(t);

Thread t3 = new Thread(t);

Thread t4 = new Thread(t);

t1.start();

t2.start();

t3.start();

t4.start();

}

}

class ThreadDemo implements Runnable {

String str = "";

int num=100;

public void run() {

while(true){

if(num>0){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+"-----"+"num="+num--);

}

}

}

}

打印结果如图:



通过打印的结果发现出现了0 -1 -2,这肯定不是我们想要的结果,现在就分析问题出现的原因



通过例子分析发现多线程安全产生的原因有

1:多线程操作共享的数据(票数),因为四个线程都是操作一个对象,而对象分配在堆内存中,操作的就是它的成员变量是

2:操作共享数据的线程有多条,在例子中体现就是if()语句 和输出语句

总结:当一个线程在执行操作共享的多条代码过程中,其他线程参与了运算,就会导致安全问题的产生!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: