Java中synchronized关键字的使用
2015-10-09 15:08
393 查看
Java中 synchronized 关键字用来同步多个线程对同一个代码块的访问。对于类中被 synchronized 修饰过的多个普通成员方法,对于同一个对象,同一时刻只能有一个方法被执行,如果有多个线程,则其他线程需要等待。通过如下的例子来说明。
其中 IncreaseThread 和 DecreaseThread 是实现了 Runnable 接口的两个线程,分别调用 increase 和 decrease 两个方法各100000次,来对 counter 进行操作。
如果 increase 和 decrease 两个方法不加 synchronized 关键字进行修饰,由于 += 和 -= 不是原子操作,会出现运行结果不可预测的情况,可能会是0,也可能会是-1,2,1等;如果加上 synchronized 关键字,increase 和 decrease 两个方法不可能同时对 counter 进行操作,所以运行结果总是 0。
public class Test { private static int counter = 0; public synchronized void increase() { counter += 1; } public synchronized void decrease() { counter -= 1; } public static void main(String []args) throws InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(4); Test test = new Test(); IncreaseThread increaseThread = new IncreaseThread(test); DecreaseThread decreaseThread = new DecreaseThread(test); executorService.submit(increaseThread); executorService.submit(decreaseThread); executorService.shutdown(); System.out.println(counter); } }
其中 IncreaseThread 和 DecreaseThread 是实现了 Runnable 接口的两个线程,分别调用 increase 和 decrease 两个方法各100000次,来对 counter 进行操作。
如果 increase 和 decrease 两个方法不加 synchronized 关键字进行修饰,由于 += 和 -= 不是原子操作,会出现运行结果不可预测的情况,可能会是0,也可能会是-1,2,1等;如果加上 synchronized 关键字,increase 和 decrease 两个方法不可能同时对 counter 进行操作,所以运行结果总是 0。
相关文章推荐
- struts2 拦截器修改request的parameters参数失败的问题
- java并发编程学习: 原子变量(CAS)
- Java中HashMap,LinkedHashMap,TreeMap的区别
- Java中key可以重复的Map集合:IdentityHashMap
- JavaBean的定义和原理及bean的动作元素
- eclipse运行时编码设置
- Java设计模式之装饰者模式
- java基础之instanceof的用法
- Java学习
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- Java学习总结--列表排序
- Access restriction在myeclipse中遇到的访问限制的问题
- 没看懂
- SpringMVC @Autowired
- 如何通过java反编译工具嵌入myeclipse来跟进查看源码
- Spring MVC Controller单例陷阱
- SpringMVC之控制器的单例和多例管理
- Spring MVC 后端获取前端提交的json格式字符串并直接转换成control方法对应的参数对象
- java拆箱装箱中的一个问题
- java版txt文件下载解决