线程锁错误案例
来源:互联网 发布:淘宝出售假冒商品投诉 编辑:程序博客网 时间:2024/06/04 19:06
在使用线程锁的时候对于一些不可变对象诸如String Integer等等可能会出现一些问题诸如下面代码:
public class ThreadSync implements Runnable{ static ThreadSync sync = new ThreadSync(); static Integer j=0; public void inscane(){ for(int i=0;i<10000000;i++){ synchronized (j){ j++; } } } @Override public void run() { inscane(); } public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(sync); Thread t2 = new Thread(sync); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(j); }}
上面代码执行出来的结果存在线程安全的;
1、由于Integer是不可变对象,当执行j++的时候实际上是生成了一个新的对象。此时由于synchronized(j);锁定的是不同的对象,所以拿到的不是同一把锁会出现安全问题。
解决方式:
1、把synchronized提升到方法级别。
2、改成synchronized(ThreadSync.class)
3、把Inetegr换成int
初次之外上面写法效率并不高,应该把synchronized拿到for循环之外
0 0
- 线程锁错误案例
- 线程案例
- iOS线程锁NSLock案例(卖火车票)
- 线程案例锁的几种方法
- 线程与锁的案例分析
- java线程概念案例
- 线程案例问题小结
- 线程同步的案例
- 线程wait小案例
- 线程Notify小案例
- java线程概念案例
- ORA-12500错误案例
- Android 错误案例
- UITouch错误案例
- Oracle 归档错误案例
- 错误处理的案例
- 著名软件错误案例
- 线程错误
- 仿QQ侧滑面板(三)
- linux原始套接字(2)-icmp请求与接收
- 使用注解springmvc配合jsp/ajax/json,实现简单的jsp遍历后台数据
- Java compiler level does not match the version of the installed Java project facet
- JNI介绍
- 线程锁错误案例
- linux原始套接字(1)-arp请求与接收
- [Node入门] => 读书笔记(一)
- Spring中bean的作用域
- 减少C++代码编译时间的方法
- QT发展简史
- 统一配置中心
- LeetCode Same Tree
- 2016年1月28日学习进度