`

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锁机制Synchronizedjava锁机制Synchronized

    "Java 锁机制 Synchronized" Java 锁机制 Synchronized...Java 锁机制 Synchronized 的实现机制是基于 Monitor 机制的,Monitor 机制是 Java 中的一种同步机制,用于解决多线程并发访问共享资源时可能出现的一些问题。

    Java synchronized使用案例

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以保证数据的一致性和完整性。这个关键词提供了互斥锁机制,防止多个线程同时执行同一段代码,确保了线程安全。 一、`...

    生产者消费者Java—synchronized 机制

    `synchronized`是Java中用于实现线程互斥的关键字,它提供了对共享资源的独占访问。当一个线程进入由`synchronized`修饰的方法或代码块时,其他试图进入同一锁的线程将被阻塞,直到该线程完成其操作并释放锁。 在这...

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

    总的来说,`synchronized`在Java中的实现机制是复杂的,它涉及到了JVM底层的锁状态转换和优化策略,旨在在保证线程安全的同时,尽可能地提高并发性能。理解这些机制有助于编写更高效的多线程代码。

    Java synchronized详细解读.docx

    总的来说,`synchronized`是Java中实现线程安全的关键工具,它通过锁机制保证了对共享资源的有序访问,防止了数据竞争问题。然而,正确使用`synchronized`需要对并发编程有深入理解,以确保性能和正确性之间的平衡。...

    java synchronized demo

    在Java编程语言中,`synchronized`关键字是一个非常重要的概念,它用于实现线程同步,以确保多线程环境下的数据一致性与安全性。本示例"java synchronized demo"旨在探讨`synchronized`关键字的用法及其作用机制。...

    [JAVA][synchronized的使用]

    在Java编程语言中,`synchronized`关键字是一个至关重要的概念,它主要用于实现线程同步,以确保多线程环境下的数据一致性与安全性。本篇文章将深入探讨`synchronized`的使用,包括其基本原理、使用方式以及实际应用...

    Java synchronized关键_动力节点Java学院整理

    3. **监视器锁**:`synchronized`关键字实际上基于Java的监视器锁(Monitor)机制,由JVM实现。当线程进入`synchronized`代码块或方法时,会获取锁并进入临界区,执行完毕后释放锁,其他线程才能继续执行。 **...

    java synchronized关键字原理、自定义一把锁来实现同步等

    ### Java synchronized 关键字原理与自定义锁实现详解 #### 一、Java synchronized 关键字原理 `synchronized` 是 Java 中的关键字之一,用于实现线程间的同步控制,确保共享资源的安全访问。它主要应用于以下两种...

    java的线程同步机制synchronized关键字的理解_.docx

    Java 线程同步机制中 synchronized 关键字的理解 Java 的线程同步机制是为了解决多个线程共享同一片存储空间所带来的访问冲突问题。其中,synchronized 关键字是 Java 语言中解决这种冲突的重要机制。 ...

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

    Java并发机制的底层实现原理涉及到多个方面,包括了本地内存与线程安全的问题、volatile关键字的使用、synchronized关键字的原理以及Java并发在处理器层面是如何实现的。通过这些机制,Java能够有效地管理多线程环境...

    Java并发控制机制ReentrantLock详解与synchronized对比分析

    内容概要:本文深入探讨了Java中的并发控制机制,重点讲解了ReentrantLock和synchronized的特点及其背后的实现原理。通过对两者的特性进行对比,详细解析了ReentrantLock在灵活性、公平性和中断响应等方面的优点。并...

    深入学习Java同步机制中的底层实现

    在Java中,主要有两种同步机制:内置的`synchronized`关键字以及基于`java.util.concurrent`包中的高级同步工具类。本文将深入探讨这些机制的底层实现,特别是通过`AbstractQueuedSynchronizer`(AQS)来理解`...

    Java使用synchronized实现互斥锁功能示例

    Java使用synchronized实现互斥锁功能示例 在Java编程语言中,synchronized关键字是实现互斥锁功能的主要手段。互斥锁是一种机制,用于控制多个线程访问共享资源的顺序,从而避免因为资源竞争而导致的程序错误。在...

    java的lock和synchronized的区别.docx

    lock 和 synchronized 都是锁的意思,但是它们有不同的实现机制和应用场景。lock 提供了更加灵活和高效的锁机制,可以满足不同场景下的需求,而 synchronized 则是 Java 中的关键字,具有语言的内置性。

    java_synchronized详解

    `synchronized`是Java语言提供的关键字之一,用于实现线程间的同步控制。通过在方法或代码块上使用`synchronized`,可以确保同一时间只有一个线程能访问这些代码区域,从而有效避免了多线程环境下的数据竞争和不一致...

    JAVA synchronized详解

    在Java编程语言中,`synchronized`是一个非常重要的关键字,它主要用于实现同步控制机制。通过使用`synchronized`,可以确保同一时刻只有一个线程能够访问被标记为同步的方法或代码块,从而避免多线程环境下的数据不...

    javasynchronized详解.pdf

    Java中的`synchronized`关键字是用于实现线程同步的重要机制,它的主要目的是确保在多线程环境中,对于共享资源的访问能够保持线程安全。当`synchronized`关键字应用于方法或代码块时,它提供了互斥访问,即在任意...

    Java-synchronized详解.docx

    在 Java 中,同步机制是通过 synchronized 关键字实现的。synchronized 可以用于方法或代码块,以确保在同一时间只有一个线程可以访问该方法或代码块。这样可以防止多个线程同时访问共享资源,避免数据不一致和 race...

Global site tag (gtag.js) - Google Analytics