Java的同步机制和synchronized关键字
开发者有时创建的多线程程序会生成错误值或产生其它奇怪的行为。古怪行为一般出现在一个多线程程序没使用同步连载线程访问关键代码部份的时候。同步连载线程访问关键代码部份是什么意思呢?在这篇文章中解释了同步,Java的同步机制,以及当开发者没有正确使用这个机制时出现的两个问题。一旦你看完这篇文章,你就可以避免在你的多线程Java程序中因缺乏同步而产生的奇怪行为。
创建多线程Java程序难吗?仅从《用Java线程获取优异性能(I)》中获得的信息你就可以回答,不。毕竟,我已经向你显示了如何轻松地创建线程对象,通过调用Thread的start()方法起动与这些对象相关的线程,以及通过调用其它Thread方法,比如三个重载的join()方法执行简单的线程操作。至今仍有许多开发者在开发一些多线程程序时面临困难境遇。他们的程序经常功能不稳定或产生错误值。例如,一个多线程程序可能将不正确的雇员资料存贮在数据库中,比如姓名和地址。姓名可能属于一个雇员的,而地址却属于另一个的。是什么引起这种奇怪行为的呢? 是缺乏同步:连载行为,或在同一时间排序,线程访问那些让多重线程操作的类和字段变量实例的代码序列,以及其他共享资源。我称这些代码序列为关键代码部份。
注意:不象类和实例字段变量,线程不能共享本地变量和参数。原因是:本地变量和参数在一个线程方法中分配——叫堆栈。结果,每一个线程都收到它自己对那些变量的拷贝。相反,线程能够共享类字段和实例字段因为那些变量在一个线程方法(叫堆栈)中没有被分配。取而代之,它们作为类(类字段)或对象(实例字段)的一部份在共享内存堆中被分配。
这篇文章将教你如何使用同步连载线程访问关键代码部份。我用一个说明为什么一些多线程程序必须使用同步的例子作为开始。我接下来就监视器和锁探讨Java的同步机制和synchronized 关键字。我通过研究由这样的错用产生的两个问题判定常常因为不正确的使用同步机制而否认了它的好处。
阅读关于线程程序的整个系列:
· 第I部份:介绍线程、线程类及Runnable
· 第II部份:使用同步连载线程访问关键代码部份
对于同步的需要
为什么我们需要同步呢?一种回答,考虑这个例子:你写一个使用一对线程模拟取款/存款金融事务的Java程序。在那个程序中,一个线程处理存款,同时其它线程正处理取款。每一个线程操作一对共享变量、类及实例字段变量,这些用来标识金融事务的姓名和账号。对于一个正确的金融事务
相关文档:
从JavaSE 到JavaEE
再从corejava1,corejava11,Java Language Specification, Second(Third) Edition, Think in java,Data Structure java depth Adventrue)
转到JavaEE(EJB,Spring,Hibernate,Webwork,struts1,strut2,jsp,servlet)
从开源组织再到自组织,再到corejava1,corejava11
到JavaWebServer,java Web Prog ......
Finalizer 不可计划的,也是危险的,一般也是不必要的. 不能在finalizer中放任何与依赖时间相关的操作,因为你不知道它什么时候被执行. 比如在finalizer中关闭文件的做法就是错误的, 根据JVM的实现方式不同,有可能导致打开的文件数过多而无法再打开文件. 也不能在finalizer中改变状态,如给数据库解锁等. finalizer还能带来� ......
/**
* 使用二分查找的方式查询指定的值
* @author ZhangYu
* @data 2010-01-23
*/
public class BinSearch {
/**
* 用递归实现二分查找
* @param data -被查找的数组
* @param value -要查找的值
* @param left -查找范围的最小值
* @param right -查找范围的最大值
* ......
我今天学习了Oracle 数据库的配置及管理:
1 Oracle 数据库体系结构简介
1.1 平常所说的 Oracle 或 Oracle 数据库指的是 Oracle 数据库管理系统. Oracle 数据库管理系统是管理数据库访问的计算机软� ......
我今天学习了struts的一些特有的功能:
struts的同步令牌机制:在struts中控制表单的重复提交
在Action的方法里面:
this.saveToken(request);
boolean flag=this.isTokenValid(request);
if(flag){
//应该从session� ......