Java多线程(二) 多线程的锁机制
2016-07-20 17:24
239 查看
当两条线程同时访问一个类的时候,可能会带来一些问题。并发线程重入可能会带来内存泄漏、程序不可控等等。不管是线程间的通讯还是线程共享数据都需要使用Java的锁机制控制并发代码产生的问题。本篇总结主要著名Java的锁机制,阐述多线程下如何使用锁机制进行并发线程沟通。
1、并发下的程序异常
先看下下面两个代码,查看异常内容。
异常1:单例模式
package com.scl.thread; public class NumberRange { private volatile int unSafeNum; public synchronized int getUnSafeNum() { return unSafeNum; } public synchronized void setUnSafeNum(int unSafeNum) { this.unSafeNum = unSafeNum; } public int addVersion() { int temp = getUnSafeNum(); temp = temp + 1; setUnSafeNum(temp); return temp; } }View Code
由此可见,使用volatile变量进行自增或自减操作的时候,变量进行temp= temp+1这一步时,多条线程同时可能同时操作这一句代码,导致内容出差。线程代码内的原子性被破坏了。
单纯使用volatile来控制boolean或者某一个int类型的时候,感觉不出太大的作用。但当volatile在修饰一个对象的时候,对象必须按照步骤进行。在单线程的情况下new一个对象必须进行三步操作:①开辟存储空间 ②初始化 ③使用变量指向该内存。在并发的情况下,虚拟机创建对象可能依据这三步依次执行。可能③在②之前执行,那么就可能会导致程序抛出空指针异常。这时候可以使用volatile保证对象初始化原子性。
以上是对Java锁机制的总结,如有问题,烦请指出纠正。代码及例子很大一部分参考了《Java 并发编程艺术》[方腾飞 著]
相关文章推荐
- Java实现 二叉搜索树算法(BST)
- Struts2异常处理机制笔记
- myeclipse svn使用教程
- 【Java集合源码剖析】HashMap源码剖析
- eclipse配置折叠/展开代码快捷键
- java学习笔记--IO流
- Eclipse使用Maven构建web项目
- Hadoop Java开发实用快捷键收藏
- java学习之panel和scrollpane类
- java图片处理,裁剪,合图,等比例缩放
- maven Perhaps you are running on a JRE rather than a JDK?
- eclipse package,source folder,folder区别及相互转换
- Java并发编程之ReentrantLock学习
- 邮件发送
- Java集合(7):HashMap
- eclipse联系关系的源码(重新关联源码)
- springMVC自动扫描@controller注解的bean
- 对于NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config的异常
- java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 解决方法
- springmvc 注解