同步代码块解决线程安全
来源:互联网 发布:ubuntu更新内核命令 编辑:程序博客网 时间:2024/06/04 18:06
需求:一辆车共50张票,三个窗口同时售票
class SaleTicket extends Thread{static int num=50;//票数Object o=new Object();public SaleTicket(String name){super(name);}@Overridepublic void run(){while(true){if(num>0){System.out.println(Thread.currentThread().getName()+"售出了第"+num+"号票");num--;}else{System.out.println("售罄了!");break;}}}}public class Sale{public static void main(String[] args){//创建三个线程,模拟三个窗口SaleTicket thread1=new SaleTicket("窗口1");SaleTicket thread2=new SaleTicket("窗口2");SaleTicket thread3=new SaleTicket("窗口3");//开启线程售票thread1.start();thread2.start();thread3.start();}}
这样的代码运行出来的结果是售出150张票,每张票分别卖给了三个不同的人,这就是线程安全问题的表现。
出现线程安全问题的根本原因:
①有两个以上的线程共享资源,
②有多个语句操作了共享资源
解决方案
线程安全问题是通过线程同步机制解决的。
同步代码块格式如下:
synchronized(锁对象){ 需要被同步的代码}
售票代码修改为:
class SaleTicket extends Thread{static int num=50;//票数Object o=new Object();public SaleTicket(String name){super(name);}@Overridepublic void run(){while(true){//同步代码块synchronized(o){if(num>0){System.out.println(Thread.currentThread().getName()+"售出了第"+num+"号票");num--;}else{System.out.println("售罄了!");break;}}}}}
同步代码块要注意事项:
①锁对象可以是任意的一个对象
②在同步代码块中调用了sleep方法并不是释放锁对象
③只有真正存在线程安全问题的时候才使用同步代码块,否则会降低安全
④多线程操作的锁对象必须是唯一共享的
阅读全文
0 0
- 同步代码块解决线程安全
- 使用同步代码块解决线程安全问题
- java线程安全之synchronized同步代码块解决脏读问题(四)
- java线程安全之同步函数和同步代码块
- javaseday12(线程,同步代码块 函数,线程安全,死锁)
- 线程-同步代码块
- 饿汉式不用同步代码块实现线程安全的问题
- 线程同步---同步代码块
- 线程同步 同步代码块
- 多线程_同步代码块的方式解决线程安全问题
- 多线程_同步代码块解决线程安全问题的解释
- [java]线程--同步代码块
- Java-线程$同步代码块
- 线程同步问题 解决同步问题的方法 synchronized方法 同步代码块
- 黑马程序员_JavaSE基础13 之 线程创建 线程安全 同步代码块
- 线程、同步代码块、同步函数、死锁
- 同步函数解决线程安全
- 多线程-线程安全问题的产生原因分析以及同步代码块的方式解决线程安全问题
- 将十进制数字转换为二进制
- 四、4、数组方法
- 八大算法思想(二)------------------递推算法
- py实现网关功能
- think python 课后题实现
- 同步代码块解决线程安全
- [BZOJ3672][NOI2014]购票-点分治-CDQ分治-斜率优化DP
- 802.11协议帧基本格式详解
- ArcGis地图的配准总结
- 【Java】有状态会话bean和无状态会话bean
- 2017年上半年总结:大三下学期,马上大四,马上要毕业了.
- node.js——麻将算法(三)胡牌相关明牌
- 【DevOps】教你一分钟认识DevOps
- bzoj 2038 小Z的袜子 莫队