*只有类或对象有锁。
*每一个类和每一个对象都有且只有一把锁。可以对类中的静态方法(类方法)和一般成员方法(对象级方法)加上synchronized关键字。在方法前加synchronized,实际上锁的是类或对象。
如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法。类的静态方法类似。
*synchronized(object){...} 则只有获得object的锁才能执行{}中的代码。锁定的是object,而不是代码。object可能在其他地方锁了,所以要小心,以免造成死锁。
*类的锁:(1)静态方法前加synchronized。 (2)synchronized(className.class).(3)synchronized(Class.forName(className).
*零长度的byte数组对象创建起来将比任何对象都经济:private byte[] lock = new byte[0];
2010.2.21增加:
wait()方法可以使调用该方法的线程释放共享资源的锁,然后从运行态退出,进入等待队列,直到被再次唤醒。
notify()方法可以唤醒等待队列中第一个等待同一共享资源的线程,并使该线程退出等待队列,进入可运行态。
notifyAll()方法可以使所有正在等待队列中等待同一共享资源的线程从等待状态退出,进入可运行状态,此时,优先级最高的那个线程最先执行。
多个线程间的同步:
1. 使用一个类作为几个线程间的共享类,它的每一个方法都加上synchronized,在类中定义标识,每个方法处理这个标识的不同值,当标识是什么值时作相应操作,处理完后唤醒其他线程:notify(); 如果不是这个值时,则等待:wait()。
下面文章使用此方法模拟生产者、消费者的行为:http://blog.sina.com.cn/s/blog_49aa016d0100092q.html
2. 使用零长度的byte数组对象。在线程中的 run() 方法里,对此对象加上synchronized,while循环,使用标识,当标识是什么值时作相应操作,处理完后唤醒其他线程:notify(); 如果不是这个值时,则等待:wait()。