我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java Thread in JVM (转)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java Thread in JVM (转)

Java Thread in JVM (转)[@more@]

Java Thread in JVM

(wang hailong)

本文从JVM的角度探讨Java Thread的语法和编译结果。如果需要获得第一手资料,请直接访问以下的资源——Java语言规范,Java虚拟机规范中有关线程的定义说明。

本文旨在介绍这些比较重要的线程相关的规范,基本上不另作发挥。(除了提到微软的“公共语言基础构造”。:-)

XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

Java Language Specification

http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#30531

JVM Specification

http://java.sun.com/docs/books/vmspec/2nd-edition/html/Compiling.doc.html#6530

http://java.sun.com/docs/books/vmspec/2nd-edition/html/Instructions2.doc9.html

http://java.sun.com/docs/books/vmspec/2nd-edition/html/Threads.doc.html

Microsoft CLI -- Common Language Infrastructure (sorry, off the topic :-)

.NET/ecma/">http://msdn.microsoft.com/net/ecma/

1.synchronized method 的java语言规范

详见http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#30531。

用synchronized关键字修饰的方法,分为两种情况:(static)静态方法,和实例方法。

 (static)静态方法的“锁”是这个拥有这个方法的对象的Class对象;实例方法的“锁”是this,拥有这个方法的当前对象实例。

怎么理解这段话,看一看下面的例子就明白了。

下面两段代码的效果完全相同。代码1 ==代码2。

代码1:

class Test {

  int count;

  synchronized void bump() { count++; }

  static int clasSCOunt;

  static synchronized void classBump() {

  classCount++;

  }

}

代码2:

class BumpTest {

  int count;

  void bump() {

  synchronized (this) {

  count++;

  }

  }

  static int classCount;

  static void classBump() {

  try {

  synchronized (Class.forName("BumpTest")) {

  classCount++;

  }

  } catch (ClassNotFoundException e) {

  ...

  }

  }

}

2.synchronized关键字的编译结果

这一节,我们来看一看synchronized关键字编译之后的java虚拟机指令是什么。

如果需要第一手资料,请参见java虚拟机规范相关的部分

http://java.sun.com/docs/books/vmspec/2nd-edition/html/Compiling.doc.html#6530

这段规范里面讲到,java虚拟机规范提供两条指令,monitorentermonitorexit,来支持线程。但是对于上一节讲到的,用synchronized修饰的方法来说,并不使用这两个方法,而只是简单地用ACC_SYNCHRONIZED标志修饰。虚拟机调用方法的时候会检查这个标志,进行同步。

synchronized语句的编译结果对应monitorentermonitorexit两条指令。

比如,下面的代码:

void onlyMe(Foo f) {

  synchronized(f) {

  doSomething();

  }

}

的编译结果是

Method void onlyMe(Foo)

  0   aload_1  // Push f 

  1   astore_2  // Store it in local variable 2

  2   aload_2  // Push local variable 2 (f)

  3   monitorenter  // Enter the monitor associated with f

  4   aload_0  // Holding the monitor, pass this and...

  5   invokevirtual #5   // ...call Example.doSomething()V

  8  aload_2  // Push local variable 2 (f)

  9  monitorexit  // Exit the monitor associated with f

  10  return  // Return normally

  11   aload_2  // In case of any throw, end up here

  12   monitorexit  // Be sure to exit monitor...

  13   athrow  // ...then rethrow the value to the invoker

3.monitorenter和monitorexit

详见http://java.sun.com/docs/books/vmspec/2nd-edition/html/Instructions2.doc9.html

monitorenter定义的一段节录:

Operation :  Enter monitor for object

Operand Stack :  ..., objectref ASPectratio="t" v:ext="edit">dbrt.gif" class="lazy" data-src="file:///C:DOCUME~1ADMINI~1LOCALS~1Tempmsohtml11clip_image001.gif">...

Description :

The objectref must be of type reference.

Each object has a monitor associated with it. The thread that executes monitorenter gains ownership of the monitor associated with objectref. If another thread already owns the monitor associated with objectref, the current thread waits until the object is unlocked, then tries again to gain ownership. If the current thread already owns the monitor associated with objectref, it increments a counter in the monitor indicating the number of times this thread has entered the monitor. If the monitor associated with objectref is not owned by any thread, the current thread becomes the owner of the monitor, setting the entry count of this monitor to 1.

这段话的意思是说,monitorenter操作的目标一定要是一个对象,类型是reference。Reference实际就是堆里的一个存放对象的地址。每个对象(reference)都有一个monitor对应,如果有其它的线程获取了这个对象的monitor,当前的线程就要一直等待,直到获得monitor的线程放弃monitor,当前的线程才有机会获得monitor。

如果monitor没有被任何线程获取,那么当前线程获取这个monitor,把monitor的entry count设置为1。表示这个monitor被1个线程占用了。

当前线程获取了monitor之后,会增加这个monitor的时间计数,来记录当前线程占用了monitor多长时间。

我们看到,monitor这个词在java虚拟机规范规定出现,但是在java语言和api文档里面并没有出现。monitor是藏在线程同步后面的原理和概念。

4.Threads and Locks

详见http://java.sun.com/docs/books/vmspec/2nd-edition/html/Threads.doc.html。

这段规范详细地介绍了thread和lock的原理。下面给出这段规范的highlight。

8.4 Nonatomic Treatment of double and long Variables (double和long类型的非原子操作。)

8.7 Rules for volatile Variables

8.10 Example: Possible Swap

8.11 Example: Out-of-Order Writes

如果对列出的这些highlight感兴趣,请访问相应的java虚拟机规范网址。

5.Why specification?

本文主要讨论java相关规范的内容。规范文档非常重要,尤其对于java,C#这种生成中间代码的语言来说。

上面说的是java的相关规范。这里顺便提一下微软.Net的相关规范。

微软的“公共语言基础构造”规范:

Microsoft CLI -- Common Language Infrastructure (sorry, off the topic :-)

http://msdn.microsoft.com/net/ecma/

这个网址上有C#语言规范,CLI规范的下载。

Enjoy it. :-)


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java Thread in JVM (转)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java Thread in JVM (转)

Java Thread in JVM (转)[@more@]Java Thread in JVM(wang hailong)本文从JVM的角度探讨Java Thread的语法和编译结果。如果需要获得第一手资料,请直接访问以下的资源——Jav
2023-06-03

解决java启动时报线程占用报错:Exception in thread “Thread-14“ java.net.BindException: Address already in use: bin

这篇文章主要给大家介绍了关于解决java启动时报线程占用:Exception in thread “Thread-14“ java.net.BindException: Address already in use: bind的相关资料,文中将解决的办法介绍的非常详细,需要的朋友可以参考下
2023-05-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录