Java是第一个内置对多线程支持的主流编程语言。在Java5以前,对多线程的支持主要是经过对块结构的同步实现的(synchronized配合wait,notify,notifyAll),Java5引入了java.util.concurrent包,提供了对多线程编程的更高层的支持。 java
在Java中,除了int等基本类型以外,一切皆为对象。synchronized关键字以及Object类中的wait,notify和notifyAll方法为咱们编写多线程程序提供了原始的支持。 算法
例如: 编程
public class A { public synchronized void fun() { ... } }
在调用方法fun以前,调用该方法的执行线程必需要先得到类A的实例(a)的对象锁。上面的方法fun在功能上等同于: 多线程
public void fun() { synchronized(this) { ... } }在执行fun以前,要获取a的对象锁,在方法fun返回以前,要释放a的对象锁。
一般可使用synchronized和notify,notifyAll以及wait方法来实现线程之间的数据传递及控制。对于对象obj来讲: 编程语言
要注意的是,wai,notify以及notifyAll方法的调用必须在相应的synchronized代码块之中。例如: ide
synchronized(obj) { while(xxx) { obj.wait(); } ... }
下面写个小例子,来讲明wait方法返回以前要从新得到对象锁,以及notify方法执行以后并不当即释放对象锁。 this
public class MThread implements Runnable { public synchronized void assign() { this.notifyAll(); System.err.println("out of notifyAll"); while(true){} } public synchronized void await() throws InterruptedException { this.wait(5000); System.err.println("out of wait"); } @Override public void run() { try { await(); } catch (InterruptedException e) { } } } public class Main { public static void main(String[] args) { MThread mThread = new MThread(); Thread thread = new Thread(mThread); thread.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } mThread.assign(); } }主线程中,先建立子线程,并启动,主线程sleep一秒钟是为了让子线程中的this.wait(5000)获得执行,而wait(5000)又保证在五秒钟结束以前,主线程中的mThread.assign()方法获得调用,进而调用子线程的notifyAll方法,来唤醒wait方法。从执行结果中能够看到“out of notifyAll”的输出,却始终看不到“out of wait”,这说明notifyAll方法执行完成,而wait方法并未返回。一个合理的解释就是wait还在等待mThread的对象锁,而notifyAll执行完成后也并未当即释放mThread的对象锁,sun的官方文档的说明也是如此。
十点半了,哎,第一次发博客,不知如何,有点小忐忑 spa