多线程之售票安全版
2015-08-05 16:18
218 查看
下面是安全版的售票程序
/* 通过分析,发现,打印出0,-1,-2等错票。 多线程的运行出现了安全问题。 问题的原因: 当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完, 另一个线程参与进来执行。导致共享数据的错误。 解决办法: 对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行。 Java对于多线程的安全问题提供了专业的解决方式。 就是同步代码块。 synchronized(对象) { 需要被同步的代码 } 对象如同锁。持有锁的线程可以在同步中执行。 没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。 火车上的卫生间---经典。 同步的前提: 1,必须要有两个或者两个以上的线程。 2,必须是多个线程使用同一个锁。 必须保证同步中只能有一个线程在运行。 好处:解决了多线程的安全问题。 弊端:多个线程需要判断锁,较为消耗资源, */ class Ticket implements Runnable { private int tick = 1000; Object obj = new Object(); public void run() { while(true) { synchronized(obj) { if(tick>0) { //try{Thread.sleep(10);}catch(Exception e){} System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--); } } } } } class TicketDemo2 { public static void main(String[] args) { Ticket t = new Ticket(); 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(); } }
相关文章推荐
- telnet退出命令
- IOS XMPP的实践
- Problem C: P1053
- 设计模式 适配器模式
- HANA激活对象报错
- Creating ADF BC View Object Instances On The Fly!!!!!!
- omci批量升级
- php mysql 事务 锁 小计
- code first使用t4模板
- Android 自定义侧滑面板
- lbypmall系统备份恢复
- ios iphone6 Plus 的适配问题
- 用VS2008编译(zlib)C语言代码的方法
- Android开发之AlarmManager详解
- iOS应用启动时不占满全屏上下有黑边问题的解决方案
- hudson部署
- bzoj 2783 树(dfs 前缀和 邻接表)(中等)
- [leetcode-75]Sort Colors(C)
- SQL Sever MD5加密。
- There is a version mismatch between the spring client and the server