Java多线程产生安全问题及对策分析
2016-11-02李建辉
李建辉
引言:在Java语言程序设计中, 多线程的并发执行可以提高程序的运行效率,但是,当多线程去访问同一个资源时,可能会引发安全问题,特别是用到线程休眠的时候,容易出现安全问题,为了解决这样的问题,第一尽量不要使用线程休眠,第二种方法是使用线程同步,限制某个资源在同一时刻只能被一个线程去访问。
一、程序示例1
我们写一个简单卖票程序,使用多线程去卖10张票,4个窗口卖10张票,我们给出第一个Java多线程程序代码及运行结果:
运行结果:
窗口1-----卖出的票9 窗口3-----卖出的票8 窗口4-----卖出的票7 窗口1-----卖出的票6窗口2-----卖出的票5 窗口3-----卖出的票4 窗口4-----卖出的票3窗口2-----卖出的票2
窗口1-----卖出的票1 窗口3-----卖出的票0 窗口4-----卖出的票-1 窗口2-----卖出的票-2
结果分析:出现卖出的票0,-1,-2张票,很显然不符合逻辑,原因在于线程休眠Thread.sleep(10)语句,当前线程进入休眠,但是CPU不会休息,马上会调入其他线程来处理,可是当前线程并没有处理完毕(卖出票),造成还有多余的票没有卖完,并由其他线程去卖(出现0,-1,-2张票)。如果没有线程休眠语句,运行结果符合逻辑,不会出现0,-1,-2张票。
二、程序示例2
同样写一个简单的多线程卖票程序,使用线程同步来处理共享资源块,使用Java关键字synchronized来写一个同步方法来卖票,该同步方法在同一时刻只能由一个线程来访问,其他线程等待,保证了资源的安全性。
结果分析:很显然运行结果符合我们的逻辑。
三、Java多线程产生安全性问题总结
Java多线程产生的安全性问题,使用同步方法能解决很好的解决多线程安全问题,特别是解决了多线程同时访问共享数据时产生的安全问题,这就需要我们在代码设计上入手,养成良好的编码习惯和规范。
参 考 文 献
[1]传智播客高教产品研发部 .java基础入门.清华大学出版社
[2] Eric. Java编程思想[M]. 第4版. 机械工业出版社
[3]王保罗.Java面向对象程序设计[M]. 北京:清华大学出版社