第十七讲 多线程——多线程的安全问题
发布日期:2021-06-30 18:03:02
浏览次数:2
分类:技术文章
本文共 1034 字,大约阅读时间需要 3 分钟。
多线程安全问题产生的原因
本文以一个简单的卖票程序为例开始讲解,上文就将该程序写出来了,程序代码如下:
class SaleTicket implements Runnable{ private int tickets = 100; public void run() { while (true) { if (tickets > 0) { try {Thread.sleep(10);} catch (InterruptedException e) {}//让线程到这里稍微停一下。 System.out.println(Thread.currentThread().getName() + "...." + tickets--); } } }}class TicketDemo2 { public static void main(String[] args) { //线程任务对象。 SaleTicket t = new SaleTicket(); //创建四个线程。通过Thread类的对象。 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(); }}
通过运行该卖票程序可以发现有可能打印出0、-1、-2等错票,如下图所示:
这就表明多线程的运行出现了安全问题,产生的原因可归纳为两点:- 线程任务中有处理到共享的数据;
- 线程任务中有多条对共享数据的操作。一个线程在操作共享数据的过程中,其他线程参与了运算,造成了数据的错误。
判断一个程序是否会有线程安全问题的标准?
- 是否是多线程环境;
- 是否有共享数据;
- 是否有多条语句操作共享数据。
如何解决多线程安全问题呢?
只要能保证多条操作共享数据的代码在某一时间段被一条线程所执行,在执行期间不允许其他线程参与运算。Java对于多线程的安全问题提供了专业的解决方式就是同步机制:同步代码块或者同步方法,把多个操作共享数据的代码给锁起来,让任意时刻只能有一个线程执行即可。注意:线程安全问题在理想状态下,不容易出现,但一旦出现对软件的影响是非常大的。
至于解决多线程安全问题的具体实现方案,且看下文讲解!转载地址:https://liayun.blog.csdn.net/article/details/82670096 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月22日 07时15分32秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
scala maven plugin
2019-04-30
flink 1-个人理解
2019-04-30
redis cli
2019-04-30
redis api
2019-04-30
flink physical partition
2019-04-30
java 解析json
2019-04-30
java http请求
2019-04-30
tensorflow 数据格式
2019-04-30
tf rnn layer
2019-04-30
常用中间件
2019-04-30
tf input layer
2019-04-30
tf model create
2019-04-30
tf dense layer两种创建方式的对比和numpy实现
2019-04-30
tf initializer
2019-04-30
tf 从RNN到BERT
2019-04-30
tf keras SimpleRNN源码解析
2019-04-30
tf keras Dense源码解析
2019-04-30
tf rnn输入输出的维度和权重的维度
2019-04-30
检验是否服从同一分布
2019-04-30
tf callbacks
2019-04-30