Java–线程安全问题
博客说明
文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!
说明
多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的
模拟线程安全的问题
模拟票
package www;
public class Ticket implements Runnable {
private int ticket = 100;
//创建锁对象
Object obj = new Object();
@Override
public void run() {
while (true){
if (ticket>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在买第"+ticket+"张票");
ticket--;
}
}
}
}
测试类
package www;
public class TicketTest {
public static void main(String[] args) {
Ticket run = new Ticket();
Thread a = new Thread(run);
Thread b = new Thread(run);
Thread c = new Thread(run);
a.start();
b.start();
c.start();
}
}
结果
产生了重复的票,这就是线程安全的问题
总结
线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写
操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,
否则的话就可能影响线程安全。
感谢
黑马程序员
百度百科
以及勤劳的自己