Java中多线程的使用(超级超级详细)线程安全 4

什么是线程安全?

有多个线程在同时运行,这些线程可能会运行相同的代码,程序运行的每次结果和单线程运行的结果是一样的,而且其他变量的值也和预期的值一样,这就是线程安全

我们下面来用一段代码来演示线程不安全的情况,下面用车站卖票来举例

package ThreadSafe;

public class Main {
public static void main(String[] args) {
//使用同一个对象
ThreadSafe threadSafe = new ThreadSafe();
Thread one = new Thread(threadSafe, "一号");
Thread two = new Thread(threadSafe, "二号");
Thread three = new Thread(threadSafe, "三号");
one.start();
two.start();
three.start();
}
}
package ThreadSafe;

public class ThreadSafe implements Runnable {
private int ticketsum=100;
public void run(){
while(true){
if (ticketsum>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
String name = Thread.currentThread().getName();
System.out.println(name+"正在卖:"+ticketsum--);
}
} }
}

结果

我们发现一号二号三号都在重复卖同一张票,这种问题在现实生活中是不被允许出现的,是会出现事故的,这就是线程不安全导致的问题

下面我们来讲解为什么会出现线程安全问题

线程安全原理解析

卖票出现了负数的票

卖票出现了重复的票

这样理解起来我当初还思考了好久,不过体验一下下面这段话后我就有点领悟了:

多线程并不是线程并行(真正的线程并行需要多个cpu),而是通过cpu时间片轮换来完成的,所以就存在一个问题,当a线程进入线程体的时候,执行了System.out语句,这是他的时间片到期了,b线程进入,b线程在他的时间片内执行完了之后,a线程接着往下运行,他用的不是b执行过的ticket--,而是原来的ticket,就导致了问题的发生

以上就是我对线程安全的一些理解,如果有错误还请各位批评指正,喜欢我的可以点赞收藏一波,我基本每天都会跟新文章,可以关注我互相交流

最新文章

  1. 正则匹配闭合HTML标签(支持嵌套)
  2. ros问题总结
  3. java 线程的终止与线程中断
  4. java 打开txt文件或者bat文件
  5. Java中的4种代码块
  6. Maven仓库分类
  7. Android中颜色的设置
  8. mssqlserver 查询数据库表结构语句
  9. Vim实用命令
  10. 第八章、Linux 磁盘与文件系统管理
  11. Generative Learning algorithms
  12. apache 负载测试工具 ab
  13. java的3大特性
  14. SpringBoot war包部署到Tomcat服务器
  15. python-flask-请求源码流程
  16. 2019-03-29-day022-封装与类方法与静态方法
  17. kafka eagel的使用
  18. andriod(十七)蓝牙profile
  19. nginxのerror_logはformat指定できない.
  20. 基于MVC4+EF5.0+Ajax+Json+CSS3的简单注册页面(get&post)

热门文章

  1. C#多线程编程(一)进程与线程
  2. Perl入门(一)Perl的基本类型及运算符
  3. JavaWeb网上图书商城完整项目--12.项目所需jquery函数介绍之ajax
  4. android handle详解
  5. Quartz.Net系列(九):Trigger之DailyTimeIntervalScheduleBuilder详解
  6. Office2019 相关激活秘钥
  7. 入门大数据---Scala学习
  8. 【部分】Asp.Net Mvc 控制器与视图的数据传递
  9. 队列的顺序存储与链式存储c语言实现
  10. Security 10:权限管理