|
| 1 | +#### 目录介绍 |
| 2 | +- 01.继承Thread类的方式卖电影票案例 |
| 3 | +- 02.实现Runnable接口的方式卖电影票 |
| 4 | +- 03.买电影票出现了同票和负数票的原因分析 |
| 5 | +- 04.线程安全问题的产生原因分析 |
| 6 | +- 05.同步代码块的方式解决线程安全问题 |
| 7 | + |
| 8 | + |
| 9 | + |
| 10 | + |
| 11 | + |
| 12 | +### 好消息 |
| 13 | +- 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计N篇[近100万字,陆续搬到网上],转载请注明出处,谢谢! |
| 14 | +- **链接地址:https://github.com/yangchong211/YCBlogs** |
| 15 | +- 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变! |
| 16 | + |
| 17 | + |
| 18 | + |
| 19 | + |
| 20 | + |
| 21 | +### 01.继承Thread类的方式卖电影票案例 |
| 22 | +- 代码如下所示 |
| 23 | +``` |
| 24 | +public class ThreadDemo { |
| 25 | + public static void main(String[] args) { |
| 26 | + /** |
| 27 | + * 需求:某电影院目前正在上映贺岁大片,共有100张票,而它有3个售票窗口售票,请设计一个程序模拟该电影院售票。 |
| 28 | + */ |
| 29 | + // 创建3个线程对象 |
| 30 | + SellTicktes t1 = new SellTicktes() ; |
| 31 | + SellTicktes t2 = new SellTicktes() ; |
| 32 | + SellTicktes t3 = new SellTicktes() ; |
| 33 | + // 设置名称 |
| 34 | + t1.setName("窗口1") ; |
| 35 | + t2.setName("窗口2") ; |
| 36 | + t3.setName("窗口3") ; |
| 37 | + // 启动线程 |
| 38 | + t1.start() ; |
| 39 | + t2.start() ; |
| 40 | + t3.start() ; |
| 41 | + } |
| 42 | +} |
| 43 | +
|
| 44 | +public class SellTicktes extends Thread { |
| 45 | + private static int num = 100 ; |
| 46 | + @Override |
| 47 | + public void run() { |
| 48 | + /** |
| 49 | + * 定义总票数 |
| 50 | + * |
| 51 | + * 如果我们把票数定义成了局部变量,那么表示的意思是每一个窗口出售了各自的100张票; 而我们的需求是: 总共有100张票 |
| 52 | + * 而这100张票要被3个窗口出售; 因此我们就不能把票数定义成局部变量,只能定义成成员变量 |
| 53 | + */ |
| 54 | + // 模拟售票 |
| 55 | + while(true) { |
| 56 | + if( num > 0 ) { |
| 57 | + System.out.println(Thread.currentThread().getName() + "正在出售" + (num--) + "张票"); |
| 58 | + } |
| 59 | + } |
| 60 | + } |
| 61 | +} |
| 62 | +``` |
| 63 | + |
| 64 | + |
| 65 | + |
| 66 | +### 02.实现Runnable接口的方式卖电影票 |
| 67 | +- 代码如下所示,假设有三个窗口 |
| 68 | +``` |
| 69 | +public class SellTicektesDemo { |
| 70 | + public static void main(String[] args) { |
| 71 | + // 创建SellTicektes对象 |
| 72 | + SellTicektes st = new SellTicektes() ; |
| 73 | + // 创建Thread对象 |
| 74 | + Thread t1 = new Thread(st , "窗口1") ; |
| 75 | + Thread t2 = new Thread(st , "窗口2") ; |
| 76 | + Thread t3 = new Thread(st , "窗口3") ; |
| 77 | + // 启动线程 |
| 78 | + t1.start() ; |
| 79 | + t2.start() ; |
| 80 | + t3.start() ; |
| 81 | + } |
| 82 | +} |
| 83 | +
|
| 84 | +public class SellTicektes implements Runnable { |
| 85 | + private static int num = 100 ; |
| 86 | + @Override |
| 87 | + public void run() { |
| 88 | + while(true) { |
| 89 | + if(num > 0) { |
| 90 | + System.out.println(Thread.currentThread().getName() + "正在出售第" + (num--) + "张票"); |
| 91 | + } |
| 92 | + } |
| 93 | + } |
| 94 | +} |
| 95 | +``` |
| 96 | + |
| 97 | +### 03.买电影票出现了同票和负数票的原因分析 |
| 98 | +- 讲解过电影院售票程序,从表面上看不出什么问题,但是在真实生活中,售票时网络是不能实时传输的,总是存在延迟的情况,所以,在出售一张票以后,需要一点时间的延迟。改实现接口方式的卖票程序,每次卖票延迟100毫秒 |
| 99 | +``` |
| 100 | +public class ThreadDemo { |
| 101 | + public static void main(String[] args) { |
| 102 | + // 创建3个线程对象 |
| 103 | + SellTicktes t1 = new SellTicktes() ; |
| 104 | + SellTicktes t2 = new SellTicktes() ; |
| 105 | + SellTicktes t3 = new SellTicktes() ; |
| 106 | + // 设置名称 |
| 107 | + t1.setName("窗口1") ; |
| 108 | + t2.setName("窗口2") ; |
| 109 | + t3.setName("窗口3") ; |
| 110 | + // 启动线程 |
| 111 | + t1.start() ; |
| 112 | + t2.start() ; |
| 113 | + t3.start() ; |
| 114 | + } |
| 115 | +} |
| 116 | +
|
| 117 | +public class SellTicktes extends Thread { |
| 118 | + private static int num = 100 ; |
| 119 | + @Override |
| 120 | + public void run() { |
| 121 | + // 模拟售票 |
| 122 | + while(true) { |
| 123 | + if( num > 0 ) { |
| 124 | + try { |
| 125 | + Thread.sleep(100) ; |
| 126 | + } catch (InterruptedException e) { |
| 127 | + e.printStackTrace(); |
| 128 | + } |
| 129 | + System.out.println(Thread.currentThread().getName() + "正在出售" + (num--) + "张票"); |
| 130 | + } |
| 131 | + } |
| 132 | + } |
| 133 | +} |
| 134 | +``` |
| 135 | + |
| 136 | + |
| 137 | +### 04.线程安全问题的产生原因分析 |
| 138 | +- 1.4.1 首先想为什么出现问题? |
| 139 | +- 是否是多线程环境,是否有共享数据,是否有多条语句操作共享数据 |
| 140 | +- 1.4.2 如何解决多线程安全问题呢? |
| 141 | +- 基本思想:让程序没有安全问题的环境。怎么实现呢?把多个语句操作共享数据的代码给锁起来,让任意时刻只能有一个线程执行即可。 |
| 142 | + |
| 143 | + |
| 144 | + |
| 145 | + |
| 146 | +### 05.同步代码块的方式解决线程安全问题 |
| 147 | +- **1.5.1 同步代码块的格式** |
| 148 | +- 同步可以解决安全问题的根本原因就在那个对象上。该对象如同锁的功能 |
| 149 | +``` |
| 150 | +synchronized(对象){ |
| 151 | + 需要同步的代码; |
| 152 | + } |
| 153 | +``` |
| 154 | + |
| 155 | +- **1.5.2 同步代码块优势和劣势** |
| 156 | +- 同步的好处:同步的出现解决了多线程的安全问题。 |
| 157 | +- 同步的弊端:当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。 |
| 158 | + |
| 159 | + |
| 160 | + |
| 161 | + |
| 162 | + |
| 163 | + |
| 164 | +### 其他介绍 |
| 165 | +#### 01.关于博客汇总链接 |
| 166 | +- 1.[技术博客汇总](https://www.jianshu.com/p/614cb839182c) |
| 167 | +- 2.[开源项目汇总](https://blog.csdn.net/m0_37700275/article/details/80863574) |
| 168 | +- 3.[生活博客汇总](https://blog.csdn.net/m0_37700275/article/details/79832978) |
| 169 | +- 4.[喜马拉雅音频汇总](https://www.jianshu.com/p/f665de16d1eb) |
| 170 | +- 5.[其他汇总](https://www.jianshu.com/p/53017c3fc75d) |
| 171 | + |
| 172 | + |
| 173 | + |
| 174 | +#### 02.关于我的博客 |
| 175 | +- github:https://github.com/yangchong211 |
| 176 | +- 知乎:https://www.zhihu.com/people/yczbj/activities |
| 177 | +- 简书:http://www.jianshu.com/u/b7b2c6ed9284 |
| 178 | +- csdn:http://my.csdn.net/m0_37700275 |
| 179 | +- 喜马拉雅听书:http://www.ximalaya.com/zhubo/71989305/ |
| 180 | +- 开源中国:https://my.oschina.net/zbj1618/blog |
| 181 | +- 泡在网上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1 |
| 182 | + |
| 183 | +- 阿里云博客:https://yq.aliyun.com/users/article?spm=5176.100- 239.headeruserinfo.3.dT4bcV |
| 184 | +- segmentfault头条:https://segmentfault.com/u/xiangjianyu/articles |
| 185 | +- 掘金:https://juejin.im/user/5939433efe88c2006afa0c6e |
| 186 | + |
| 187 | + |
| 188 | + |
| 189 | + |
| 190 | + |
| 191 | + |
| 192 | + |
| 193 | + |
| 194 | + |
| 195 | + |
| 196 | + |
| 197 | + |
| 198 | + |
| 199 | + |
0 commit comments