如何判断一个程序是否会有线程安全问题?
2018-04-05 22:53
495 查看
如何判断一个程序是否会有线程安全问题?
示例代码如下:
SellTicket.java
/* * 如何解决线程安全问题呢? * * 要想解决问题,就要知道哪些原因会导致出问题:(而且这些原因也是以后我们判断一个程序是否会有线程安全问题的依据) * A:是否是多线程环境 * B:是否有共享数据 * C:是否有多条语句操作共享数据 * * 我们来回想一下我们的程序有没有上面的问题呢? * A:是否是多线程环境 是 * B:是否有共享数据 是 * C:是否有多条语句操作共享数据 是 * * 由此可见我们的程序出现问题是正常的,因为它满足出问题的条件。 * * 接下来才是我们要想想如何解决问题呢? * A和B的问题我们改变不了,我们只能想办法去把C问题改变一下。 * * * 思想: * 把多条语句操作共享数据的代码部分给包起来(锁起来),让某个线程在执行的时候,别人不能来执行。 * (即:把多个语句操作共享数据的代码给锁起来,让任意时刻只能有一个线程执行即可) * * 问题是:我们不知道怎么包啊?其实我也不知道啊!但是Java给我们提供了:同步机制。 * * 生活举例: * 火车上厕所。 * 医院挂号看病。 * * 同步代码块: * synchronized(对象) { * 需要同步的代码; * } * * A:对象是什么呢? * 我们可以随便创建一个对象先试试,例如:new Object()。 * B:需要同步的代码是哪些呢? * 把多条语句操作共享数据的代码部分给包起来(锁起来)。 * * 注意: * 同步可以解决安全问题的根本原因就在那个对象上。该对象如同锁的功能。 * 多个线程必须是同一把锁。 * */
示例代码如下:
package cn.itcast_09; public class SellTicket implements Runnable { // 为了让多个线程对象共享这100张票和锁对象(同一把锁),我们应该用静态修饰。 // 定义100张票 private int tickets = 100; // 创建锁对象 private Object obj = new Object(); /* @Override public void run() { while (true) { synchronized(new Object()){ // 我们可以随便创建一个对象先试试,例如:new Object()。 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--) + "张票"); } } } } }
SellTicket.java
相关文章推荐
- 线程安全 问题 如何判断一个类是否是线程安全的
- 问题3:如何用递归算法判断一个数组是否是递增?
- c/s程序版本自动升级的问题,如何判断client端版本号是否最新,然后从指定ftp服务器down
- 在 Java 的多线程中,如何去判断给定的一个类是否是线程安全的(另外:synchronized 同步是否就一定能保证该类是线程安全的。)
- 请教一个问题,Android应用运行时在调用某个API(比如相机)时,系统如何判断这个应用是否具备相应的权限?
- 请教一个问题,Android应用运行时在调用某个API(比如相机)时,系统如何判断这个应用是否具备相应的权限?
- 在 Java 的多线程中,如何去判断给定的一个类是否是线程安全的(另外:synchronized 同步是否就一定能保证该类是线程安全的。)
- c/s程序版本自动升级的问题,如何判断client端版本号是否最新,然后从指定ftp服务器down
- 如何判断LSTM模型中的过拟合和欠拟合 By 机器之心2017年10月02日 11:09 判断长短期记忆模型在序列预测问题上是否表现良好可能是一件困难的事。也许你会得到一个不错的模型技术得分,但了解
- 如何判断一个捕鱼游戏程序是否好
- 如何用.net程序来判断一个网站是否正常打开小解
- 请教一个问题,Android应用运行时在调用某个API(比如相机)时,系统如何判断这个应用是否具备相应的权限?
- 在delphi中如何判断一个文件正在被其它的程序或进程所调用?
- JavaScript 里如何判断一个字符串里是否存在某个字符串?(支持中文)
- C#实现如何判断一个字符串是否为整数和浮点
- .net C# 如何判断一个对象是否具有某个方法
- 如何判断一个单向链表是否有环路
- 如何判断程序是否已经执行
- 如何判断一个文件或目录是否存在
- 打包安装VS2005开发程序时如何判断指定软件是否安装(比如ARCENGINE RUNTIME或FRAMEWORK)