Java多线程同步如何从JVM的角度体会

开发 后端
Java多线程同步需要我们深入的学习,在这其中我们要注意在不同的角度考虑问题,下面就是在JVM角度中看Java多线程同步。

我们在使用Java多线程同步的时候需要了解很多的知识,其中Java多线程同步机制实际上是靠锁的概念来控制的。这个问题就需要我们引起注意,那么在Java程序当中,锁是如何体现的呢?

让我们从JVM的角度来看看锁这个概念:

在Java程序运行时环境中,JVM需要对两类线程共享的数据进行协调:

1)保存在堆中的实例变量

2)保存在方法区中的类变量

这两类数据是被所有线程共享的。(程序不需要协调保存在Java 栈当中的数据。因为这些数据是属于拥有该栈的线程所私有的。)

在java虚拟机中,每个对象和类在逻辑上都是和一个监视器相关联的。对于对象来说,相关联的监视器保护对象的实例变量。对于类来说,监视器保护类的类变量。
(如果一个对象没有实例变量,或者一个类没有变量,相关联的监视器就什么也不监视。) #t#

为了实现监视器的排他性监视能力,java多线程同步虚拟机为每一个对象和类都关联一个锁。代表任何时候只允许一个线程拥有的特权。线程访问实例变量或者类变量不需锁。但是如果线程获取了锁,那么在它释放这个锁之前,就没有其他线程可以获取同样数据的锁了。(锁住一个对象就是获取对象相关联的监视器)

类锁实际上用对象锁来实现。当虚拟机装载一个class文件的时候,它就会创建一个java.lang.Class类的实例。当锁住一个对象的时候,实际上锁住的是那个类的Class对象。

一个线程可以多次对同一个对象上锁。对于每一个对象,java虚拟机维护一个加锁计数器,线程每获得一次该对象,计数器就加1,每释放一次,计数器就减 1,当计数器值为0时,锁就被完全释放了。

java多线程同步不需要自己动手加锁,对象锁是java虚拟机内部使用的。在java程序中,只需要使用synchronized块或者synchronized方法就可以标志一个监视区域。当每次进入一个监视区域时,java 虚拟机都会自动锁上对象或者类。

看到这里,我想你们一定都疲劳了吧?当一个有限的资源被多个线程共享的时候,为了保证对共享资源的互斥访问,我们一定要给他们排出一个先来后到。而要做到这一点,对象锁在这里起着非常重要的作用。
 

责任编辑:张浩 来源: CSDN
相关推荐

2011-06-22 13:57:54

Java多线程

2011-06-22 13:47:16

Java多线程

2011-04-14 13:27:53

Synchronize多线程

2010-03-15 19:37:00

Java多线程同步

2010-01-21 11:27:30

linux多线程机制线程同步

2015-09-10 09:30:54

Java多线程同步

2009-03-24 08:56:23

数据同步多线程Java

2010-03-17 18:21:54

Java多线程静态数据

2010-03-16 17:39:36

Java多线程锁

2015-07-22 09:39:38

IOS多线程同步

2015-07-22 09:51:51

iOS开发线程

2009-09-14 19:39:14

批量线程同步

2010-03-15 16:31:34

Java多线程

2010-03-15 17:56:23

Java多线程

2012-06-05 02:12:55

Java多线程

2009-06-29 18:44:28

Java多线程Synchronize同步变量

2013-07-16 12:13:27

iOS多线程多线程概念GCD

2009-06-29 18:32:52

Java多线程Synchronize

2022-07-07 00:33:34

Java线程同步

2010-03-15 18:34:08

Java多线程
点赞
收藏

51CTO技术栈公众号