转载自:http://dev.10086.cn/cmdn/bbs/thread-70729-1-3
概括起来说,Java 多线程同步机制主要包含如下几点:
1:如果一个类包含一个或几个同步方法,那么由此类生成的每一个对象都配备一个队列用来容纳那些等待执行同步的线程。
2:对于一个线程来说,有两种途径会使其进入等待队列,一种是在其他线程调用含有同步方法的对象时,此线程正在调用这个对象的方法,另一种方法是此线程调用了 wait() 方法。
3:当一个线程从一个同步方法调用返回时,或者调用 wait() 方法时,其他线程就可以访问此对象。
4:作为总的原则,系统总是使队列中拥有最高级优先级的线程获得运行机会。
5:如果一个线程由于调用 wait() 方法而进入等待队列,那么,它必须由别的线程通过调用notify() 方法来唤醒它,才能安排它重新执行。
不可否认,上面列出的几个原则有些繁杂,但在实际处理中其实很简单,只要按照下列三条规则就可以了。
一:如果两个或多个线程修改一个对象,那么将执行修改操作的方法用关键字 synchronized 定义为同步方法。
二:如果一个线程必须等待某个对象的状态被改变,那么,此线程应在对象队列中等待,这种等待是通过进入同步方法或者调用wait() 方法来实现的。
三:每当一个方法修改了某个对象的状态的时候,这个方法就应该再调用 notify() 方法,这样给那些处于等待队列中的线程一个机会,使其能够检测环境是否已经发生了改变,从而可使其重新运行。
另补:同步机制的特点和功能是很突出的,但是他并不能解决多线程系统中的全部问题,特别是死锁问题,比如银行系统是的进入帐户问题。当一个程序在运行的时候出现了死锁,Java 系统是无能无力的。所以,用户自己设计线程的时候,要确保不出现死锁。同步问题和死锁的避免问题是有相当难度的课题哟。得花时间好好学学。
------解决方案--------------------------------------------------------