在语言级别支持多线程是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分布式应用学习笔记03JVM对线程的资源同步和交互机制
深入JVM系列-逃逸分析、同步省略、栈上分配、标量替换深入JVM系列-逃逸分析、同步省略、栈上分配、标量替换逃逸分析方法逃逸线程逃逸优化同步省略同步省略对性能影
操作系统实验教程 第十九章 线程同步和调度(源码) ps:都是已编译过的源代码~可以运行!!
JVM同步原语 volatile CAS 线程安全 保护“共享数据” 低级并发工具 原子变量 锁(内部锁和显式锁) 线程安全容器 同步容器 并发容器 阻塞队列 高级线程协作工具 信号量 闭锁 关卡 ...
线程安全与锁优化:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者再调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果。
JVM负责装载class文件并执行,因此,首先是JDK如何将Java代码编译为class文件、如何...JVM提供了多线程支持,对于分布式Java应用而言,通常要借助线程来实现高并发,JVM中线程资源如何同步的机制及线程之间交互的机制。
说明:本人在给Java游戏开发特训班讲解多线程时,需要说明多线程同步的问题,其中讲解了使用“生产者-消费者”模型来解决同步问题。可是当时特训班的学生不是很明白,特别是不明白这个模型怎么使用。这可能是由于...
通过 RMI 使用信号量的 JVM 间同步本模块将说明使用运行在 RMI 中的基于信号量的传递管理器来控制多个 JVM 之间的同步。 ####1.4 基于阻塞队列的订单管理系统的发布者-主题 Borker-Subcriber 模式这个模块是为了...
第85讲 同步指令 00:07:34 第86讲 类加载机制概述 00:07:26 第87讲 类加载时机 00:13:15 第88讲 类加载的过程-加载 00:15:15 第89讲 类加载的过程-验证 00:10:24 第90讲 类加载的过程-准备 00:05:...
包含了摩根面试的技术要点,涉及JVM架构,内存回收,Classloader等JDK底层技术,也包括像HashMap,ConcurrentHashMap,Object线程同步等API的解读,还涉及了Spring AOP原理解析等框架技术。
去做在“同步器”部分中,使多个线程保持相同的锁。 当我们有线程在等待未命名的锁,而我们找不到它在等待哪个锁时,就会发生这种情况。 当然这是错误的,但是如果我们不能说,我们就不能说。 在“顶级运行方法”...
第85节同步指令00:07:34分钟 | 第86节类加载机制概述00:07:26分钟 | 第87节类加载时机00:13:15分钟 | 第88节类加载的过程-加载00:15:15分钟 | 第89节类加载的过程-验证00:10:24分钟 | 第90节类加载的过程-准备...
2.5互斥同步 2.6线程合作 三、Synchronized 详解 3.1 使用 3.2 原理分析 3.3 JVM中锁的优化 3.4 Synchronized与Lock 3.5 扩展 四、volatile 详解 4.1 作用 4.2 实现原理 4.3 应用场景 五、final 详解 5.1...
每当易变的变量在线程间共享时,都必须使用同步来确保一个线程所做的更新,能够及时地被其他线程看到。同步的主要方式就是使用synchronized块,它既提供了互斥又提供了可见性保证。当两个线程都想访问共享的易变变量...
冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。 Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可 用的 CPU 上。当原生线程初始化完毕,就会...
JVM (Java Virtual Machine) 是Java平台的核心组件之一,它是一个虚拟机,用于在计算机上执行Java字节码。 ...它可以创建和管理线程,并提供线程同步和互斥机制,以确保线程安全。 JVM是Java跨平
JVM (Java Virtual Machine) 是Java平台的核心组件之一,它是一个虚拟机,用于在计算机上执行Java字节码。 JVM的主要功能有以下几个: ...它可以创建和管理线程,并提供线程同步和互斥机制,以确保线程安全。
JVM (Java Virtual Machine) 是Java平台的核心组件之一,它是一个虚拟机,用于在计算机上执行Java字节码。 JVM的主要功能有以下几个: ...它可以创建和管理线程,并提供线程同步和互斥机制,以确保线程安全。
冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。 Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可 用的 CPU 上。当原生线程初始化完毕,就会...
4,多线程在JVM中的实现原理剖析 导语: 什么是多线程? 多线程(multithreading)是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而...