日期:2014-05-16 浏览次数:20380 次
Java虚拟机支持多条线程同时执行。多线程在Java中通过Thread类表现。对用户来说创建线程的唯一方式就是构造一个Thread类的对象;每个Java线程都和此类有关。通过调用Thread对象的start()方法来启动线程。
当线程没有正确同步的时候,多线程的行为将是不可预测的。本规范将介绍Java程序中多线程的语义,包括多个线程更新共享内存时哪些读共享内存的值的可见性规则。本规范与内存模型都适用不同的硬件架构,本规范的语义被称为Java内存模型。
本规范的语义没有介绍多线程程序应该怎样执行。而是只介绍了多线程程序允许的行为。任何执行策略只能产生允许的行为才是可接受的执行策略。
1、1?????????锁
Java提供了多种线程间通信的机制。这些方法最基本的机制就是使用监视器(monitor)实现的同步(synchronization)。Java中每一个对象都有一个线程可以锁定(lock)和解锁(unlock)的监视器。同一时间只允许一个线程持有监视器的锁。任何其他试图获取这个监视器的锁的线程将被阻塞,直到能够获取监视器的锁。
一个线程可以多次获取同一个监视器的锁,相应的,每次解锁将产生与锁定相反的影响。
synchronized表达式计算出对一个对象的引用,然后试着在对象监视器上执行锁定行为,在锁定行为完成之前,程序将不能执行。在完成锁定行为之后,synchronized体开始执行。Synchronized体完成之后,不管是正常执行完还是有异常发生,在此对象监视器将自动执行释放锁动作。
当synchronized修饰的方法被调用的时候,锁行为将自动触发,直到成功获取锁后,方法体才执行。如果方法是实例方法,将锁定被执行实例对象的监视器(这个对象就是广为人知的this执行方法体期间)。如果是静态方法,将锁定定义方法的Class对象的监视器。方法执行结束后,不管有没有异常发生都将在同一个监视器上自动的调用解锁行为。