JAVA 虚拟机规范之第17章 线程和锁

来源:互联网 发布:md5算法是不是对称加密 编辑:程序博客网 时间:2024/06/08 00:16

尽管前面章节都是在讲单个语句或表达式的一次执行行为,即单线程内的执行情况,其实,jvm支持多个线程同时运行。这些线程相互独立的操作共享主内存中的数据(数值和对象)。多线程可能运行在多处理器上,或者时间分片的单处理器上,或者时间分片的多处理器上。

线程用Thread类表示。用户想要创建一个线程,只有一个方法:创建一个Thread类的对象;每个线程都是一个Thread类的对象。当对象中的start()方法被调用时,线程开始执行。

如果没有正确的处理多线程之间的同步,多线程的执行结果可能让人困惑甚至是反常的。这章阐述多线程程序的语义(Semantics),这些语义包括一些规则,这些规则是用来说明,对于多线程同时操作的共享内存区,读操作得到的数值究竟是什么的数值。As the specification is similar to the memory models for different hardware architectures, these semantics are known as the Java programming language memory model.在不引起歧义的情况下,我们将这些规则简称为“内存模型”。

这些语义不是规定多线程程序应该如何执行,而是说明多线程程序允许的行为。任何能产生被允许的行为的多线程执行策略都是可接受的执行策略。

17.1 同步

Java语言提供多种线程间通信的机制,其中最基本的方式称为“同步”,该方式通过监视器(Monitor)实现。Java中的每个对象都关联一个监视器,线程可以对监视器执行加锁(Lock)或解锁(Unlock)操作。某一时刻,只有一个线程持有一个监视器的锁,而其他试图对该监视器加锁的线程都会被阻塞,直到它们能够拿到监视器的锁。一个线程可以对某个监视器加锁多次;每次解锁操作则释开一个锁。

由synchronized修饰的方法(详见8.4.3.6节),一旦被调用,会自动执行加锁操作,只有加锁完成才会执行方法体内的语句。


to be continued…

0 0