如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。
  在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;
  而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。
  那好,现在我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。
如何做到线程安全:
四种方式 sychronized关键字
1. sychronized method(){}
2. sychronized (objectReference) {/*block*/}
3. static synchronized method(){}
4. sychronized(classname.class)
其中1和2是代表锁当前对象,即一个对象就一个锁,3和4代表锁这个类,即这个类的锁。要注意的是sychronized method()不是锁这个函数,而是锁对象,即:如果这个类中有两个方法都是sychronized,那么只要有两个线程共享一个该类的reference,每个调用这两个方法之一,不管是否同一个方法,都会用这个对象锁进行同步。
注意:long 和double是简单类型中两个特殊的咚咚:java读他们要读两次,所以需要同步。
java 线程安全 JAVA

0

收藏

上一篇:Java编程中写出好代码的建议 下一篇:浅谈Android五大布局
noavatar_middle.gif
wulianghuan

191篇文章,41W+人气,1粉丝

关注
noavatar_middle.gif

Ctrl+Enter 发布

发布

取消

推荐专栏更多

92f96bca4a81e7c15a63e696e2a8d8e5.jpg
微服务技术架构和大数据治理实战

大数据时代的微服务之路

共18章 | 纯洁微笑

¥51.00 669人订阅
订   阅
a940c66317ecbe58436a2ad3831c2d7d.png
基于Python的DevOps实战

自动化运维开发新概念

共20章 | 抚琴煮酒

¥51.00 428人订阅
订   阅

猜你喜欢

我的友情链接 伪锁 Java多线程编程总结 Java关键字final、static使用总结 java万年历简单制作 Java内部类的使用小结 Java中的main()方法详解 Java相对路径读取文件 Java线程:创建与启动 Java线程:线程的同步与锁 深入研究java.lang.ThreadLocal类 java.util.logging.Logger使用详解 Spring Boot 中 10 行代码构建 RESTful 风格应用 Java核心库实现AOP过程 RabbitMQ如何保证队列里的消息99.99%被消费? 几种简单的负载均衡算法及其Java代码实现 RabbitMQ如何保证消息99.99%被发送成功? IT兄弟连 JavaWeb教程 经典案例 在阿里架构师眼中构建一个较为通用的业务技术架构就是如此简单 Spring Boot 整合 Mybatis 的完整 Web 案例
f92360e227f9d91cdff7ea95120630ef.png
left-qr.jpg

扫一扫,领取大礼包

0

分享
qr-url?url=https%3A%2F%2Fblog.51cto.com%2Fmrwlh%2F1027161
关注
wulianghuan
noavatar_middle.gif