如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。
比如一个 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关键字
如何做到线程安全:
四种方式 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读他们要读两次,所以需要同步。
注意:long 和double是简单类型中两个特殊的咚咚:java读他们要读两次,所以需要同步。
©著作权归作者所有:来自51CTO博客作者wulianghuan的原创作品,如需转载,请注明出处,否则将追究法律责任
java
线程安全
JAVA
0
收藏
上一篇:Java编程中写出好代码的建议
下一篇:浅谈Android五大布局
推荐专栏更多
![92f96bca4a81e7c15a63e696e2a8d8e5.jpg](https://s1.51cto.com/images/blog/201804/27/92f96bca4a81e7c15a63e696e2a8d8e5.jpg)
微服务技术架构和大数据治理实战
大数据时代的微服务之路
共18章 | 纯洁微笑
¥51.00 669人订阅
订 阅
![a940c66317ecbe58436a2ad3831c2d7d.png](https://s1.51cto.com/images/blog/201808/03/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](https://s1.51cto.com/images/blog/201905/05/f92360e227f9d91cdff7ea95120630ef.png)
![left-qr.jpg](https://static1.51cto.com/edu/blog/mobile/images/left-qr.jpg)
扫一扫,领取大礼包
0
分享
wulianghuan
![noavatar_middle.gif](https://ucenter.51cto.com/images/noavatar_middle.gif)
转载于:https://blog.51cto.com/mrwlh/1027161
Ctrl+Enter 发布
发布
取消