Java多线程同步问题的探究

Java多线程同步问题的探究

ID:46048908

大小:61.13 KB

页数:3页

时间:2019-11-20

Java多线程同步问题的探究_第1页
Java多线程同步问题的探究_第2页
Java多线程同步问题的探究_第3页
资源描述:

《Java多线程同步问题的探究》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、众所周知,在Java多线程编程中,一个非常重要的方而就是线程的同步问题。关于线程的同步,一般冇以下解决方法:1.在需要同步的方法的方法签名中加入synchronized关键字。2.使用synchronized块对需要进行同步的代码段进行同步。3.使用JDK5屮提供的java.util.concunent.lock包屮的Lock对象。另外,为了解决多个线程对同-•变量进行访问时可能发牛:的安全性问题,我们不仅可以采用同步机制,更可以通过JDK1.2中加入的ThreadLocal来保证更好的并发性。本篇中,将详细的讨论Java多线程同步机制,并对ThreadLocal做出探讨。大致的目录

2、结构如下:一、线程的先来后到——问题的提出:为什么耍有多线程同步?Java多线程同步的机制是什么?二、给我一把锁,我能创造一个规矩——传统的多线程同步编程方法有哪些?他们有何异同?三、Lock来了,大家都让开Java并发框架中的Lock详解。卩[【、你有我有全都有——ThreadLocal如何解决并发安全性?五、总结——Java线程安全的几种方法对比。一、线程的先来后到我们来举一个的例子:某餐厅的卫生间很小,几乎只能容纳一个人如测。为了保证不受干扰,如厕的人进入卫牛间,就要锁上房门。我们可以把卫牛•间想象成是共享的资源,而众多需要如厕的人可以被视作多个线程。假如卫牛间当前右人占川,那

3、么具他人必须等待,肓到这个人如厕完毕,打开房门走岀来为止。这就好比多个线程共享一个资源的时候,是一定要分出先来示到的。有人说:那如呆我没有这道门会怎样呢?让两个线程相互竞争,谁抢先了,谁就可以先干活,这样多好阿?但是我们知道:如果厕所没有门的话,如厕的人i起涌向测所,那么必然会发生争执,正常的如厕步骤就会被打乱,很有可能会发生意想不到的结果,例如某些人可能只好被迫在不正确的地方施肥……正是因为有这道门,任何一个单独进入如厕的人都可以顺利的完成他们的如厕过程,而不会被干扰,甚至发生以外的结果。这就是说,如测的时候耍讲究先来后到。那么在Java多线程程序当中,当多个线程竞争同一个资源的时

4、候,如何能够保证他们不会产生“打架,,的情况呢?有人说是使用同步机制。没错,像上面这个例子,就是典型的同步案例,一旦笫一位开始如厕,则笫二位必须等待笫一位结朿,才能开始他的如厕过程。一个线程,一旦进入某一过程,必须等待正常的返回,并退出这一过程,下一个线程才能开始这个过程。这里,最关键的就是卫生间的门。其实,卫生间的门担任的是资源锁的角色,只要如测的人锁上门,就相当于获得了这个锁,而当他打开锁出来以后,就相当于释放了这个锁。也就是说,多线程的线程同步机制实际上是靠锁的概念來控制的。那么在Java程序当中,锁是如何体现的呢?让我们从JVM的角度来看看锁这个概念:在Java程序运行时环境

5、屮,JVM需要对两类线程共享的数据进行协调:1)保存在堆屮的实例变量2)保存在方法区屮的类变最这两类数据是被所有线程共享的。(程序不需要协调保存在Java栈当中的数据。因为这些数据是属于拥有该栈的线程所私有的。)在java虚拟机中,每个对彖和类在逻辑上都是和一个监视器相关联的。对于对象來说,相关联的监视器保护对象的实例变量。对于类来说,监视器保护类的类变量。(如果一个对象没冇实例变虽,或者一个类没冇变量,相关联的临视器就什么也不临视。)为了实现监视器的排他性监视能力,java虚拟机为每一个对象和类都关联-个锁。代表任何时候只允许•个线程拥有的特权。线程访问实例变量或者类变量不需锁。但

6、是如果线程获取了锁,那么在它释放这个锁Z前,就没有其他线程町以获取同样数据的锁了。(锁住一个对彖就是获取对彖相关联的监视器)类锁实际上用对象锁来实现。当虚拟机装载-个class文件的吋候,它就会创建一个java.lang.Class类的实例。当锁住一个对象的吋候,实际上锁住的是那个类的Class对彖。一个线程可以多次对同一个对彖I二锁。对于每一个对彖,java虚拟机维护一个加锁计数器,线程每获得一次该对彖,计数器就加1,每释放一次,计数器就减1,当计数器值为0时,锁就被完全释放了。java编程人员不需要自己动手加锁,对象锁是java虚拟机内部使用的。在java程序中,只需要使用syn

7、chronized块或者synchronized方法就可以标志一个监视区域。当每次进入一个监视区域时,java虚拟机都会自动锁上対象或者类。看到这里,我想你们一定都疲劳了吧?o(n_A)o...哈哈。让我们休息一下,但是在这Z前,请你们一定要记着:当一个有限的资源被多个线程共亨的时候,为了保证对共亨资源的互斥访问,我们一定要给他们排出一个先来麻到。而要做到这一点,对象锁在这里起着非常重要的作用。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。