`
reilost
  • 浏览: 16883 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

并发总结(2)

    博客分类:
  • Java
阅读更多
并发总结(1)

3.线程的安全.

上面提到过同步机制来协调访问,防止风险.在Java中首要的同步机制是synchronized关键字,提供了独占锁,除此外还有volatile,jdk5里加入的显示锁lock,reentrantLock和原子变量.


在说这些之前呢,不得不提一下,jvm内的同步机制,jvm使用的同步机制是等待并唤醒监视器.

3.1 监视器

监视器支持互斥和写作.jvm通过对线锁实现互斥,让多个线程在同一个共享数据上独立且不影响其他线程的进行工作.协作则是通过Object类的wait和notify方法来实现的,允许多个线程为了一个目标而一起工作.
如图--.--.....


这个图里展示了线程与监视器交互的过程.
如果一个线程到达监视的时候,他会先进入入口区,这时候如果没有线程,则会直接进入下阶段然后持有监视器,然后执行任务.
反之,如果有线程在持有,新来的就会在入口区等待.
在持有中的线程,有两种情况,一种是执行完毕,则释放监视器然后退出.而执行了等待的命令的会进入释放后进入右边的等待区.这时候,如果下一个执行线程执行完毕后,没有执行唤醒,而且这之前也没有等待中的线程被唤醒,那入口区的线程会竞争监视器的持有权.获胜的会进入持有.
如果有唤醒,入口区与等待区就要一起竞争了...
一个线程只有在他持有监视器时才能执行等待命令,而且只有再一次持有监视器后才能离开等待区.

jvm里提供了两种唤醒命令,notify和notifyall..
notify随意从等待区选择一个线程并将其标志为可能唤醒,notifyall会把所有等待区的线程标识为可能唤醒..

3.2 对象锁

jvm对每一个对象和类都加了一个锁.如果线程获取了锁,在他释放前,没有其它线程可以获取同样数据的锁了..
这里要说下哈,线程共享使用一部分数据,另外的数据是被线程私有的..共享的数据是堆和方法区里的数据.也就是说访问,在堆里的实例变量和在方法区里的类变量是要协调线程间数据共享的.而在栈中的局部变量,是属于拥有该栈的线程私有的.

一个对象的关联的监视器会保护对象的实例变量,
一个类的关联的监视器会保护类的类变量.
如果对象没有是咧,类没有类变量,那么关联的监视器就什么都不监视了.

还有,jvm加载一个class的时候会创建一个Class类的实例,所以类锁也就是对象锁的一种实现,他锁的是那个类的class对象.

3.3
在Java代码里,有两种可以监视的区域,一个是语句,一个是方法..当一个线程到达这个区域第一条指令的时候,就要加锁,获得了锁以后,就会进入代码开始执行,当离开代码的时候,无论如何离开,相关的锁都会释放.

随便写个同步语句的..
	public  int getValue(){
		synchronized (this) {
			value++;
		}
		return value;
	}


嗯.看下字节码..这里要说下,同步语句用的操作码是MONITORENTER和MONITOREXIT
public getValue()I
    TRYCATCHBLOCK L0 L1 L2 
    TRYCATCHBLOCK L2 L3 L2 
   L4
    LINENUMBER 6 L4
    ALOAD 0
    DUP
    ASTORE 1
    MONITORENTER
   L0
    LINENUMBER 7 L0
    ALOAD 0
    DUP
    GETFIELD com/reilost/thread/GetSequence.value : I
    ICONST_1
    IADD
    PUTFIELD com/reilost/thread/GetSequence.value : I
   L5
    LINENUMBER 6 L5
    ALOAD 1
    MONITOREXIT
   L1
    GOTO L6
   L2
    ALOAD 1
    MONITOREXIT
   L3
    ATHROW
   L6
    LINENUMBER 10 L6
    ALOAD 0
    GETFIELD com/reilost/thread/GetSequence.value : I
    IRETURN
   L7
    LOCALVARIABLE this Lcom/reilost/thread/GetSequence; L4 L7 0
    MAXSTACK = 3
    MAXLOCALS = 2


然后看下同步这个方法
public synchronized int getValue(){
		value++;
		return value;
	}


把关键字加在方法上会有啥样滴变化呢.-.-..看字节码
  public synchronized getValue()I
   L0
    LINENUMBER 6 L0
    ALOAD 0
    DUP
    GETFIELD com/reilost/thread/GetSequence.value : I
    ICONST_1
    IADD
    PUTFIELD com/reilost/thread/GetSequence.value : I
   L1
    LINENUMBER 7 L1
    ALOAD 0
    GETFIELD com/reilost/thread/GetSequence.value : I
    IRETURN
   L2
    LOCALVARIABLE this Lcom/reilost/thread/GetSequence; L0 L2 0
    MAXSTACK = 3
    MAXLOCALS = 1


对比一下就会发现,区别就是这里没有使用任何特别的操作码.这段代码没有进入和离开监视器的代码.因为同步方法的时候,方法不包含用于保存加锁对象的局部变量,所以方法每次用的局部变量的位置都是不固定的..当执行这个同步方法的时候,jvm会在调用方法前就获取一个锁,如果是实例方法,就取得对象关联的锁,类方法的话取得是类的锁,就是这个类的Class对象的缩.,执行结束后,会释放这个锁..

嗯..大家看下第一个同步语句字节码在推出监视的时候,有一个athrow
 MONITOREXIT
   L3
    ATHROW

这个是jvm加上的,作用是来保证锁被释放.不管如果同步语句如何退出,锁总是会被释放..
而在同步方法里并没有这样一个操作过程..

还有就是静态方法的时候,线程获得的是Class实例的锁.

............我果然不擅长码字啊...orz....写了这么多废话竟然-.-....我听从@EricChaw同学的...明天继续码...
分享到:
评论
6 楼 liuwenjie517333 2010-05-19  
请问楼主,是用什么工具查看字节码?
5 楼 12345678 2010-05-18  
有点深奥,还需慢慢体会。
4 楼 lyw985 2010-05-18  
LZ不用介意,曲高和寡,很正常
3 楼 reilost 2010-05-18  
goby1220 写道
真的没看懂

额,不好意思-.-我确实不擅长这种东西....慢慢锻炼嘿嘿,请见谅
2 楼 hesy_007 2010-05-18  
值得细细品味
1 楼 goby1220 2010-05-18  
真的没看懂

相关推荐

    高并发总结

    《高并发总结》 在计算机领域,高并发是系统设计中的关键挑战,涉及到多个概念和技术。本文将深入探讨其中的一些核心知识点。 1. **同步与异步**:同步交互是发送请求后必须等待响应,而异步交互则无需等待,可以...

    Java并发编程技术总结

    Java并发编程技术总结,所含内容有并发特性、并发锁、线程池、并发场景解决方案等,对于性能思考和内容参考资料有一定说明

    java 并发学习总结

    本学习总结将深入探讨并发容器、同步容器、同步工具、死锁、异常处理、线程中断、线程池、返回结果以及同步方法等核心概念。 1. **并发容器**:Java提供了一系列的并发容器,如`ConcurrentHashMap`,它在并发环境下...

    高并发处理总结

    高并发处理总结

    最牛并发编程总结.png

    一共包括了java内存模型、并发基础、锁、并发工具类、java并发编程实战、优化、阻塞队列、原子操作、并发集合、线程池、线程基础、自定义并发类等13个方面的内容。 学习并发编程一张图就搞定了。

    阿里P8架构师谈:高并发架构解决方案总结

    高并发是指在同一个时间点,有很多用户同时访问URL地址,比如:淘宝的双11、双12,就会产生高并发。又如贴吧的爆吧,就是恶意的高并发请求,也就是DDOS攻击。服务端:导致站点服务器/DB服务器资源被占满崩溃,数据的...

    并发编程总结.xmind

    java并发编程总结,包括多线程安全机制分析总结,Unsafe源码分析总结,并发工具类总结,ThreadLocal原理和使用,Fork/Join框架使用总结,同步容器和并发容器源码分析

    Java 多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中不可或缺的一部分,它涉及到如何高效地利用CPU资源,实现并发执行多个任务。在操作系统层面,多线程是为了提高系统利用率,使得多个任务能够"同时"执行,但实际上,由于CPU的时钟...

    提高系统并发方法总结

    ### 提高系统并发方法总结:深入解析 在现代信息技术领域,尤其是针对Web项目的开发与运维,提高系统的并发处理能力成为了确保用户体验与系统稳定性的重要因素。本文将深入探讨四种有效提升Web项目并发性的策略:...

    Java并发理论知识框架总结

    本知识框架是对《Java并发编程实战》一书的总结,主要围绕基本线程和线程池的使用、线程使用中出现的三大问题以及如何解决这些问题出发总结出了这个知识框架,通过该框架能更加深入的去理解Java并发理论知识。

    CsGo并发流程控制框架

    八、总结 CsGo并发流程控制框架结合了C#语言的特性和.NET Framework的强大支持,为开发者提供了丰富的工具和策略来应对高并发环境的挑战。通过对`ConsoleTest`项目的分析,我们可以更好地理解如何在实际开发中应用...

    Java并发专题面试总结复习总结题集

    Java并发专题面试总结复习总结题集

    java并发编程与高并发处理.xmind

    java并发编程总结,为xmind格式,总结的很详细,包含常见的并发容器,锁等知识

    优化nginx大并发——轻松应对上万并发访问

    总结来说,优化Nginx以应对大并发访问,不仅需要对系统参数进行调整,还要对Nginx的配置进行精细控制,通过合理的进程管理、网络连接处理和资源分配策略,实现高效且稳定的高并发服务。同时,持续的压力测试和性能...

    基于并发服务器几种实现方法(总结)

    ### 基于并发服务器几种实现方法(总结) 在现代互联网技术中,为了处理大量并发请求,提升服务器响应效率及稳定性,开发人员通常会采用多种技术手段实现并发服务器。本文将详细探讨几种常见的并发服务器实现方法,...

    Java_多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细介绍与知识点总结.mp4 │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致...

    Java 常见并发容器总结

    Java 常见并发容器总结 JDK 提供的这些容器大部分在 `java.util.concurrent` 包中。 - **`ConcurrentHashMap`** : 线程安全的 `HashMap` - **`CopyOnWriteArrayList`** : 线程安全的 `List`,在读多写少的场合性能...

Global site tag (gtag.js) - Google Analytics