线程安全问题
2017-05-12 15:59
169 查看
5月12日java学习笔记
多线程的实际运用中解决安全问题
举例:车站三个窗口同时卖50张车票run()中卖票代码
”’
while(true) {
synchronized (“锁”) {
if (ticketname > 0) {
System.out.println(Thread.currentThread().getName() + “售出第” + (51 - ticketname) + “号票”);
ticketname–;
} else {
System.out.println(Thread.currentThread().getName() + “票已售罄”);
break;
}
}
}
”’
1,首先创建一个线程对象,车票申请为静态数据,三个线程共享。重写run()方法为卖票过程。
2,主函数中创建上线程对象,分别为三个对象命名,方便区分卖出票的窗口,同时调用start()方法。
此时出现问题,出现线程安全问题,比如三个窗口都卖出了一号票,因为运行过程中,线程抢夺随时发生,所以导致出现安全问题,比如线程1刚刚判断ticketname,还没打印语句,线程2就抢过去判断,然后线程3又抢过去判断,导致最后三个线程都输出了1号票
3,为解决线程问题,sun公司引入了synchronized(){}对象锁住大括号类区域类的代码,当一个线程进入锁区域以后会锁起这个区域,其他线程只能在外面等待,当进入内部的线程执行完以后出大括号区域,再开锁,所有线程再一起抢夺执行权。
synchronized(){}:
1,原理与方法:大括号内部就包括需要锁住的代码区,小括号里面引入一个对象,每个对象都存在一种状态,这个状态就作为锁的开关标志,0为开,1为关。
2,注意点:对于括号中的对象,需要带入一个共享唯一的对象,可以在线程类中申请一个静态的对象当做这个锁芯,或者直接在里面加一个字符串,但要注意的是,不能用new的匿名对象,也不能在线程类中申请一个非静态的对象当做锁芯,不然对于每个线程来讲这把锁就没有了作用。
相关文章推荐
- servlet与Struts action线程安全问题分析!
- servlet线程安全问题
- 单例模式的线程安全问题
- 初探LinkedList线程安全问题(一)
- servlet与Struts action线程安全问题分析
- struts2+spring的Action线程安全问题
- 一个在线连接数引发的Delphi线程安全(Thread Safe)问题
- 对java中File.mkdirs方法线程安全问题的一点探讨
- 初探LinkedList线程安全问题
- Pro*C 线程安全问题案例
- VS2005 多线程问题--窗体中的线程安全调用
- 关于struts中Action是否线程安全问题?
- 线程安全问题
- servlet与Struts action线程安全问题分析
- Pro*C 线程安全问题案例
- delphi关于线程安全问题
- 深入研究servlet 实例,线程安全等方面问题
- 深入研究servlet的线程安全问题(转)
- 几个问题(三)--------线程安全的概念,实现线程安全的几种方法
- servlet与Struts action线程安全问题分析!