多线程-线程安全问题的产生原因分析以及同步代码块的方式解决线程安全问题
2017-06-03 09:20
429 查看
package cn.itcast_09; public class SellTicket implements Runnable { // 定义100张票 private int tickets = 100; //创建锁对象 private Object obj = new Object(); // @Override // public void run() { // while (true) { // synchronized(new Object()){不能new,要用同一个对象 // if (tickets > 0) { // try { // Thread.sleep(100); // } catch (InterruptedException e) { // e.printStackTrace(); // } // System.out.println(Thread.currentThread().getName() + "正在出售第" // + (tickets--) + "张票"); // } // } // } // } @Override public void run() { while (true) { synchronized (obj) { if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + (tickets--) + "张票"); } } } } }
package cn.itcast_09; /* * 如何解决线程安全问题呢? * * 要想解决问题,就要知道哪些原因会导致出问题:(而且这些原因也是以后我们判断一个程序是否会有线程安全问题的标准) * A:是否是多线程环境 * B:是否有共享数据 * C:是否有多条语句操作共享数据 * * 我们来回想一下我们的程序有没有上面的问题呢? * A:是否是多线程环境 是 * B:是否有共享数据 是 * C:是否有多条语句操作共享数据 是 * * 由此可见我们的程序出现问题是正常的,因为它满足出问题的条件。 * 接下来才是我们要想想如何解决问题呢? * A和B的问题我们改变不了,我们只能想办法去把C改变一下。 * 思想: * 把多条语句操作共享数据的代码给包成一个整体,让某个线程在执行的时候,别人不能来执行。 * 问题是我们不知道怎么包啊?其实我也不知道,但是Java给我们提供了:同步机制。 * * 同步代码块: * synchronized(对象){ * 需要同步的代码; * } * * A:对象是什么呢? * 我们可以随便创建一个对象试试。 * B:需要同步的代码是哪些呢? * 把多条语句操作共享数据的代码的部分给包起来 * * 注意: * 同步可以解决安全问题的根本原因就在那个对象上。该对象如同锁的功能。 * 多个线程必须是同一把锁。 */ public class SellTicketDemo { public static void main(String[] args) { // 创建资源对象 SellTicket st = new SellTicket(); // 创建三个线程对象 Thread t1 = new Thread(st, "窗口1"); Thread t2 = new Thread(st, "窗口2"); Thread t3 = new Thread(st, "窗口3"); // 启动线程 t1.start(); t2.start(); t3.start(); } }
相关文章推荐
- 多线程-同步代码块解决线程安全问题的解释以及同步的特点及好处和弊端
- 多线程_线程安全问题的产生原因分析
- 多线程_同步代码块的方式解决线程安全问题
- Commons-net FTPClient completePendingCommand()经常使程序死掉的原因分析以及解决方式
- Commons-net FTPClient completePendingCommand()经常使程序死掉的原因分析以及解决方式
- Android ListView异步载入图片乱序问题,原因分析及解决方式
- 采用DoGet方式提交中文,乱码产生原因分析及解决办法
- 各种编码问题产生原因以及解决办法---------响应编码,请求编码,URL编码
- windows服务发布过程中遇到问题的原因分析及解决方式
- Junit单元测试不支持多线程测试--原因分析和问题解决
- web安全扫描问题(常见的)分析以及解决方式
- 多线程——引入同步代码块解决窗口卖票产生负票的问题
- 白苹果问题解决办法以及原因简单分析
- GridView异步加载中一次加载完所有数据问题的解决以及其原因分析
- 多线程_同步代码块解决线程安全问题的解释
- web安全扫描问题(常见的)分析以及解决方式
- JS实现简易日历过程中遇到的问题和原因以及解决方式。
- form表单的post,get提交方式分析以及产生的乱码问题
- 使用redis集群+tomcat缓存共享下session丢失问题产生原因以及解决
- web安全扫描问题(常见的)分析以及解决方式