码迷,mamicode.com
首页 > 其他好文 > 详细

哒哒哒

时间:2017-07-21 17:21:05      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:同步   virtual   ret   所有权   翻译   nbsp   moni   对象   占用   

多线程:

 1. 多线程的3中运行方式:

 2. synchronized是一个重量级锁
   
 3. sychronized的锁类型 和  位置
    java 为每个类实例和类都设置了一个锁并且遵循一定的锁机制。
    在分析sychronized 逻辑是,关键点就是分析出提供锁的对象是哪个?实例,还是类
  
    Java中每一个对象都可以作为锁,这是synchronized实现同步的基础: 
  1. 普通同步方法,锁是当前实例对象 
  2. 静态同步方法,锁是当前类的class对象 
  3. 同步方法块,锁是括号里面的对象(某个实例对象或者class对象)
  
 4.synchronized 实现原理(javap filename.class)
   同步代码块:monitorenter指令插入到同步代码块的开始位置,monitorexit指令插入到同步代码块的结束位置。
        每个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令
          时尝试获取monitor的所有权,过程如下:
          1.如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者。
          2.如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1.
          3.如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再重新尝试获取monitor的所有权。
 
        执行monitorexit的线程必须是objectref所对应的monitor的所有者。
        monitor的进入数减1,如果减1后进入数为0。

   同步方法:  synchronized方法则会被翻译成普通的方法调用和返回指令如:invokevirtual、areturn指令,在VM字节码层面并没有任何
        特别的指令来实现被synchronized修饰的方法,而是在Class文件的方法表中将该方法的access_flags字段中的synchronized
        标志位置1。如果设置了,执行线程将先获取monitor。并没有通过指令monitorenter和monitorexit来完成

哒哒哒

标签:同步   virtual   ret   所有权   翻译   nbsp   moni   对象   占用   

原文地址:http://www.cnblogs.com/qinjiayan/p/7218093.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!