`

java synchronized 的实现机制

阅读更多
最近在做项目的时候遇到了较多的同步问题 。

JAVA 给我们提供了很方便的方法去解决多线程同步的问题   synchronized 关键字 
一直很疑惑  synchronized 是怎么来做同步的呢   实现 原理是什么呢     ?

1 synchronized -- 对象加锁

所有对象都自动含有单一的锁,JVM负责跟踪对象被加锁的次数。
如果一个对象被解锁,其计数变为0。
在任务(线程)第一次给对象加锁的时候, 计数变为1。
每当这个相同的任务(线程)在此对象上获得锁时,计数会递增。
只有首先获得锁的任务(线程)才能继续获取该对象上的多个锁。
每当任务离开时,计数递减,当计数为0的时候,锁被完全释放。
synchronized就是基于这个原理,同时synchronized靠某个对象的单一锁技术的次数来判断是否被锁,所以无需(也不能)人工干预锁的获取和释放。
原理!!!!!!!!!! 如果结合方法调用时的栈和框架(如果对方法的调用过程不熟悉建议看看http://wupuyuan.iteye.com/blog/1157548),
不难推测出synchronized原理是基于栈中的某对象来控制一个框架,
所以对于synchronized有常用的优化是锁对象不锁方法。
实际上 synchronized作用于方法时,锁住的是“this”,
作用于静态方法/属性时,锁住的是存在于永久带的CLASS,相当于这个CLASS的全局 锁,锁作用于一般对象时,锁住的是对应代码块。
在HotSpot中JVM实现中,锁有个专门的名字:对象监视器。  
当多个线程同时请求某个对象监视器时,对象监视器会设置几种状态用来区分请求的线程 Contention List:所有请求锁的线程将被首先放置到该竞争队列,是个虚拟队列,不是实际的Queue的数据结构。  Entry List:EntryList与ContentionList逻辑上同属等待队列,ContentionList会被线程并发访问,为了降低对 ContentionList队尾的争用,而建立EntryList。,Contention List中那些有资格成为候选人的线程被移到Entry List  Wait Set:那些调用wait方法被阻塞的线程被放置到Wait Set  OnDeck:任何时刻最多只能有一个线程正在竞争锁,该线程称为OnDeck 
分享到:
评论

相关推荐

    Java synchronized详细解读.docx

    Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。 需要明确的几个问题: synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句...

    Java 之 synchronized实现机制(monitor)及其优化(CAS操作、Java对象头、偏向锁).docx

    使用内建锁(synchronized)进行同步,关键在于要获取指定锁对象monitor对象,当线程获取monitor后才能继续向下执行,否则就只能等待。这个获取过程是互斥的,即同一时刻只有一个线程能够获取到对象的monitor监视器...

    生产者消费者Java—synchronized 机制

    自己写的生产者消费者程序,是一个完整的工程项目,导入到eclipse即可运行,在这里提供给需要的人。

    Java synchronized 详解.docx

    Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。 需要明确的几个问题: synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句...

    Java并发机制的底层实现原理.pdf

    主要总结了:本地内存和线程安全的问题、volatile、synchronized、处理器实现并发的方式、Java实现并发的方式。

    java关键字Synchronized详解

    ava中的关键字synchronized是一种用于实现线程同步的机制。它可以确保在同一时刻,只有一个线程能够访问被synchronized修饰的代码块或方法。这种机制可以有效地避免多线程环境下的数据竞争和不一致问题。 在Java中...

    Java基础知识点 - 内容比较全面

    1.6 Java中的synchronized使用 1.7 Java中的反射机制 1.8 Java中Heap与Stack的区别 1.9 Java中String和StringBuffer的区别 1.10 Java中Comparable和Comparator实现对象比较 1.11 Java中的JNDI (Java命名与目录...

    JAVA CAS实现原理与使用.docx

    在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁)。 锁机制存在以下问题: (1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。 (2...

    深入讲解java线程与synchronized关键字

    Java 中多线程的同步依靠的是对象锁机制,synchronized关键字就是利用了封装对象锁来实现对共享资源的互斥访问。下面这篇文章主要介绍了java线程与synchronized关键字的相关资料,需要的朋友可以参考下。

    手写synchronized

    (此代码不能运行,因为很多c++中的机制在java中不能实现)此代码仅用于学习synchronized的过程,从看了synchronized的源码后,根据c++中synchronized进行java手写。以MySynchronized类的monitorEnter方法为加锁入口,...

    Java岗位常规面试题.pdf

    1. Java中的多态(Polymorphism)是什么?请举例说明多态的应用场景。 2. 请解释Java中的反射(Reflection)机制以及其在实际项目中的应用。 3. Java中的HashMap和...10. Java中的什么机制实现了面向对象编程(Object-

    Lock接口与synchronized关键字

    Lock接口与synchronized关键字在Java并发编程中都是用于实现同步机制的重要工具,但它们在使用方式、功能特性以及灵活性等方面存在一些显著的差异。 首先,从使用方式上来看,synchronized是Java语言内置的关键字,...

    java高并发相关知识点.docx

    锁:Java中的锁机制,包括synchronized关键字和ReentrantLock类。 线程池:Java中的线程池机制,包括线程池的创建、执行任务、关闭等操作。 并发集合:Java中的并发集合,包括ConcurrentHashMap、...

    复习synchronized之底层原理

    关键字,Java利用锁机制实现线程同步的一种方式。 Java实现线程同步的方式: 1.显式锁(lock,需要自己写代码去获取锁和释放锁); 2.隐式锁(synchronized,自动的)。 synchronized的保证的特性 原子性:被...

    Java基础知识大全《自学宝典》

    java自学宝典:java 如何实现线程的安全:线程的同步机制 * 方式一:同步代码块 * synchronized(同步监视器){ * //需要被同步的代码块(即为操作共享数据的代码) * } * 1.共享数据:多个线程共同操作的同一个数据...

    Java面试题.docx

    14、Java中实现多态的机制是什么? 16、说说你对Java反射的理解 17、说说你对Java注解的理解 18、Java中String的了解 19、String为什么要设计成不可变的? 20、Object类的equal和hashCode方法重写,为什么? ...

    第16讲synchronized底层如何实现?什么是锁...1

    极客时间 | Java核心技术36讲所谓锁的升级、降级,就是 JVM 优化 synchronized 运行的机制,当 JVM 检测到不同的竞争状况时,会自动切换

    Java多线程编程 线程同步机制.docx

    锁正是基于这种思路实现的一种线程同步机制。 在对共享数据加锁后,每个线程在访问共享数据时必须先申请相应的锁。一旦获得锁后,就可以访问共享数据,并且一个锁同一时刻只能被一个线程持有,这意味着获得锁后不会...

Global site tag (gtag.js) - Google Analytics