Java中多线程的使用(超级超级详细)线程安全原理解析 4
时间:2022-07-25
本文章向大家介绍Java中多线程的使用(超级超级详细)线程安全原理解析 4,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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,就导致了问题的发生
以上就是我对线程安全的一些理解,如果有错误还请各位批评指正,喜欢我的可以点赞收藏一波,我基本每天都会跟新文章,可以关注我互相交流
- MySQL日志文件之错误日志和慢查询日志详解
- 采用HTML5之"data-"机制自由提供数据
- Spring和SpringMVC父子的容器之道---[上篇]
- 快速完成(图片旋转,查看原图)
- Jsp中格式化时间戳的常用标签
- 反射+自定义注解---实现Excel数据列属性和JavaBean属性的自动映射
- 后台模板管理系统___左侧菜单数据的异步加载
- Shiro眼皮下玩ajax,玩出302 Found
- 对于JSONObject,我只是临时抱佛脚
- 总结切面编程AOP的注解式开发和XML式开发
- SpringMVC注解@RequestMapping之produces属性导致的406错误
- SpringBoot集成MyBatis的分页插件PageHelper(回头草)
- SpringBoot整合Mybatis之进门篇
- Tomcat和Java Virtual Machine的性能调优总结
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释