在语言级别支持多线程是java语言的一大优势。之前的java并发系列博客中介绍了一些相关的基础知识。这里我们来看看java虚拟机对java多线程的支持。
JVM对多线程的支持有两种:
1 互斥:通过对象锁来实现
2 协同:通过Object类的wait,notify,notifyAll方法来实现
关于互斥:
我们讲过,在JVM的运行时数据区,方法区和堆区是被多有线程共享的,java栈和PC寄存器是线程独占的。因此我们需要考虑多线程访问方法区和堆区时的数据安全问题。
方法区中的共享数据是类变量,堆区的共享数据是对象变量。(不懂看类的生命周期和对象的生命周期相关博客)
Java虚拟机会自动的为每一个类或者对象都关联一个锁,前者叫类锁,后者叫对象锁。可红色部分明明说互斥是通过对象锁来完成的,难道说错了?
这里就需要了解,在jvm中真的是只有对象锁的。逻辑上说的类锁是通过为类的Class对象加锁形成的。在java中,我们常常会使用几种写代码的方式:
第一种 (同步方法)
private synchronized void xxxXxx(){...};
第二种(同步块)
private void xxxXxx(){
synchronized(this){
...}
}
第三种 (静态同步方法)
private static synchronized void xxxXxx(){...};
第四种(静态同步块)
private static void xxxXxx(){
synchronized(A.class){
...}
}
第五种:(私有锁)
private Object myLock=new Object();
上面的第一种形式,当一个类对象a调用xxxXxx方法时,会获得该对象a的对象锁,从而保证方法被同步执行。第二种形式this指代当前方法,因此执行代码块时也会获得a的对象锁。第三种形式,当类A执行他的xxxXxx方法时,会获得类A的类锁,即类A的Class对象的对象锁。第四种形式,当执行代码块的时候,会获得类A的类锁。第五种形式,利用对象myLock的对象锁。
因此,在原理上,第一种和第二种是相同的,第三种和第四种是相同的。
由此可见,在JVM中,锁都是以对象锁的形式存在的。
当JVM在生成对象的时候,会自动的为每一个对象关联一个锁。这就保证了每个对象有对象锁,而每个类有类锁。
关于协作:
JVM对线程协作的支持是通过Object类的wait,notify,notifyAll方法来实现的。
wait方法:使持有当前对象锁的线程释放该对象锁,并进入等待区
notify方法:唤醒一个正在等待当前对象锁的线程
notifyAll方法:唤醒所有正在等待当前对象锁的线程
从对这些方法的功能描述应该容易理解,这些方法必须在同步方法或者同步代码块中被调用。
分享到:
相关推荐
为了在激烈的Java开发者竞争中脱颖而出,深入理解Java基础知识、JVM(Java虚拟机)、线程并发以及常用框架是至关重要的。这份"java-java面试题库整理-基础-JVM-线程并发-框架等.zip"文件提供了一个全面的复习资源,...
7. **多线程与并发**:讲解JVM中的线程创建、同步机制(如synchronized、Lock),以及并发容器(如ConcurrentHashMap)的实现原理。 8. **类文件结构**:分析.class文件的组成,包括魔数、版本号、常量池、访问标志...
JVM如何处理运行时异常,以及线程的创建、同步、通信和中断等都是JVM的重要知识点。"jvm-demo"可能会有相关代码示例,帮助我们深入理解这些概念。 8. **字节码与编译器** JVM执行的是字节码,而JIT(Just-In-Time...
### Java分布式应用学习笔记03:JVM对线程的资源同步和交互机制 在深入探讨Java虚拟机(JVM)如何处理线程间的资源同步与交互机制之前,我们先来明确几个关键概念:线程、多线程、同步、并发以及它们在Java中的实现...
在探究JVM线程状态以及Thread.sleep的实现原理时,我们首先需要了解Java线程与操作系统线程之间的关系。在Java虚拟机(JVM)中,每个线程通常都是以一对一的关系映射到操作系统线程上的。然而,尽管两者在实现上是...
然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程中被称为线程同步或线程协调。Java提供了一些高级特性来实现这样的需求,比如`Thread`类、`synchronized`关键字...
- **Java虚拟机栈(Java Virtual Machine Stack)**:与线程同步,用于存储局部变量、操作数栈、方法返回地址等信息,每个方法调用对应一个栈帧。 - **本地方法栈(Native Method Stacks)**:处理Java Native ...
1. **线程同步**:synchronized、Lock、volatile关键字以及wait/notify机制。 2. **线程池**:ExecutorService、ThreadPoolExecutor和ScheduledExecutorService的使用和优化。 通过理解和掌握这些知识点,开发者...
例如,如果一个线程长时间处于`WAITING`状态,可能是由于死锁或者同步块的问题;如果一个线程在执行无休止的循环,那么应该检查循环条件和退出逻辑。 总之,`show-busy-java-threads.sh` 是一个非常实用的工具,...
Java虚拟机(JVM)是Java程序运行的基础,它的核心组成...了解这些内容,可以有效避免内存溢出、提高应用响应速度,并能更好地应对多线程环境下的数据同步问题。对于Java开发人员而言,这些都是不可或缺的专业技能。
锁粗化是逃逸分析技术(Escape Analysis)的一个应用,其目的是减少多线程中锁的竞争和同步开销。它通过合并相邻的几个锁定区域来实现这一点,从而减少锁定操作的频率。 锁粗化这一概念其实可以类比为编译器优化中...
本文将详细讲解如何利用`vmmap`监控JVM,理解其核心概念,以及分析JVM线程。 首先,`vmmap`是Apple提供的命令行工具,用于显示进程的虚拟内存映射。通过这个工具,我们可以查看JVM进程中的堆、栈、元空间、代码缓存...
在并发编程中,锁是实现线程同步的重要机制。JUC提供了多种锁的实现,包括公平锁和非公平锁、可重入锁、自旋锁、独占锁、共享锁等。锁的选择和使用极大地影响着并发性能。 #### 同步器 JUC的同步器包括...
还能了解多线程环境下的同步和通信机制,以及异常处理的细节。 总的来说,JikesRVM是一个宝贵的教育资源,无论是对初学者还是经验丰富的开发者,都能从中受益。通过深入研究,你可以更全面地理解Java平台的工作原理...
#### 三、线程同步与生命周期管理 **7. 线程同步方法** - **`wait()`**:使线程等待,并释放锁。 - **`sleep()`**:使线程睡眠一段时间,不释放锁。 - **`notify()`**:唤醒等待池中的一个线程。 - **`...
栈是线程私有的,每个线程在启动时都会创建一个虚拟机栈,栈的生命周期与线程同步,即随线程创建而创建,随线程结束而销毁。栈的主要任务是为每个方法的执行提供一个栈帧(Stack Frame),栈帧存储了方法执行过程中...
3. **Linux内核层**:这是线程的核心,包括线程的创建、停止和同步等操作,都依赖于内核的系统调用。在Linux中,核心部分是pthread库。 线程创建流程: 1. **Java API层**:创建`Thread`对象时不立即创建线程,而是...
线程控制通常涉及以下几个方面:线程创建、线程同步、线程调度等。这些机制共同作用于程序内部,确保各个线程能够按照预期的方式运行。 ##### 2. 操作系统层面的线程控制 以Windows Server 2008为例,系统能够支持...
操作系统中的线程同步和调度是计算机系统中至关重要的概念,特别是在多任务并行处理和并发执行的环境中。本文将深入探讨这两个主题,并结合C++语言的源码来解析其实现。 首先,线程同步是指在多线程环境下,控制多...
Java提供了`synchronized`关键字、`Lock`接口以及相关工具类(如`ReentrantLock`、`Semaphore`等)来实现线程同步。 7. **线程安全问题分析和解决** - 线程安全问题主要包括:数据竞争、死锁、活锁和饥饿等。解决...