`

java中的锁

    博客分类:
  • java
 
阅读更多

1.重入锁 自旋锁 死锁

3.1定义: 当持1个线程的锁 再次获取锁时不会被锁住

3.2自旋锁:线程空转CPU(不会去堵塞等待其他线程唤醒)获取锁

3.3死锁:1个线程在等待另外一个等待的线程

While( true) {

}   // 空转CPU

2.线程安全性问题

3.4活跃性问题

死锁 

    2个线程彼此持有对方的需要的锁  

1 线程A拥有 对象锁1 同时等待线程B释放对象锁2

2 线程B拥有 对象锁2 同时等待线程A释放对象锁1

饥饿

    线程一直获取不到CPU运行时间的机会 

 总结原因有3 

  1 高优先级线程吞噬了低优先级线程的时间

  2 线程被堵塞在等待区

  3 线程在等待的对象也处理wait状态 导致现在一直等待

解决办法 使用锁而不用synchronize 使用公平锁保证指定的线程被notify

公平锁的大概实现原理:每一个线程都和一个QuenenObject对象相关联从而保证线程能被指定的唤醒同时能被保证指定的堵塞(一个线程在等待的对象也处在等待状态)

活锁

    

多线程一定快吗?

单核CPU存在多线程 会存在上下文切换 会有一定的资源消耗

AbstractQuenendSynchronizer(AQS)

3.线程安全性总结

3.1出现线程安全性条件

     

3.5解决线程安全性的途径 

注意:1偏向锁是在只有一个锁的情况下才使用的,轻量级锁是在多线程交替执行时才使用的如果存在多个线程同时竞争一个锁轻量级线程就会升级为重量级锁 Synchronized依赖于底层操作系统的mutex Lock来实现的 用户在使用时会从用户态到核心态会消耗CPU资源,为了减少重量级锁获取和释放带来的资源消耗 jdk6引入了 偏向锁 和轻量级锁                                   锁的其他优化:1 适应性自旋 2 锁消除 3锁粗化

1.使用synchronized(jdk6偏向锁 轻量级锁 重量级锁)关键字 、

 偏向锁:偏向锁首先会判断锁标识位是否是偏向锁 如果是判断线程ID是否指向当前线如果是就进入同步代码块,如果不是就通过CAS去竞争锁 如果当前线程竞争到了锁就直接进入到同步代码块 否则获取到偏向锁的线程被挂起,锁升级为轻量级锁 被阻塞在安全点的线程执行同步代码块

 

 轻量级锁

  加锁的过程:1 判断对象Mark Word是01表示对象无锁,虚拟机会在当前线程的栈帧中建立一个Lock Record的空间 用于存储锁对象的Mark Word的拷贝,官方成为displaced mark record    2 拷贝对象头的Mark Word到Lock Record中去 3 更新mark Word为Lock Record的指针 并将Lock Record的owner指向object 如果更新成功就进入到 4 否则进入到5              4如果更新成功就表示这个MarkWord的锁状态为00(轻量级锁) 表示该线程拥有了锁      5 如果更新失败就检查mark word是否指向了当前线程 如果指向就代表当前线程已经拥有了锁,线程就进入到同步执行块 否则就是多个线程进行了竞争 锁进行升级为重量级锁后来进来的线程被堵塞

注意:轻量级锁和偏向锁减少了锁的释放和获取消耗的CPU资源 只有线程竞争非常激烈时才会去进行线程堵塞 随后OS调用进行唤醒操作

  解锁的过程:

重量级锁:

2. 使用volitale关键字(只能保证可见性 不能保证原子性)

3.使用jdk提供的原子类

4.使用Lock

3.6认识的”*锁”

4.线程wait notify(线程之间的通信) 

  线程之间的通信解决的是线程之间的协作

Wait会释放锁 notify会随机一个线程再次获取锁 notifyAll会所有线程获取锁  

Wait 和notify都会关联一个相同的对象的监视器锁对象

 

分享到:
评论

相关推荐

    JAVA中锁概及运用.doc

    JAVA 中锁概及运用 JAVA 中锁是指在多线程环境下,用于控制对共享资源的访问的机制。锁是 Java 并发编程的核心概念之一,锁机制可以确保在多线程环境下,共享资源不会被多个线程同时访问,从而避免数据不一致和其他...

    JAVA中锁的解决方案.docx

    JAVA 中锁的解决方案 在 JAVA 中,锁是非常重要的概念,它可以帮助开发者解决多线程编程中出现的同步问题。在本文中,我们将深入介绍 JAVA 中锁的解决方案,包括乐观锁和悲观锁的定义、核心代码剖析以及使用场景。 ...

    改善Java中锁的性能_.docx

    在Java编程中,锁是多线程环境下保证数据一致性与安全性的重要机制。然而,不当的锁使用可能导致性能下降,甚至引发死锁等严重问题。本文将探讨如何通过优化策略改善Java中锁的性能。 首先,理解锁竞争是性能瓶颈的...

    java并发锁面试知识

    java中的乐观锁与悲观锁,synchronized与ReentrantLock重入锁的说明与比较

    彻底理解Java中的各种锁.pdf

    通过以上对Java锁机制的详细介绍,可以看出Java在并发控制方面具有丰富的工具和策略,它们能够帮助开发者在多线程编程中处理好资源竞争和线程协作的问题,从而编写出高效且线程安全的应用程序。

    java 中锁的性能提高办法

    【Java 中锁的性能提高办法】 在 Java 多线程编程中,锁是实现线程安全的关键机制。然而,不当的锁使用可能会导致性能瓶颈,甚至引发死锁等问题。以下是一些提高 Java 中锁性能的技术和策略: 1. **分离锁(Lock ...

    java 读写锁代码

    Java 读写锁是Java并发编程中的一种重要机制,它为多线程环境下的数据访问提供了更为精细的控制。在Java的`java.util.concurrent.locks`包中,`ReentrantReadWriteLock`类实现了读写锁的功能。这个锁允许多个读取者...

    java锁详解.pdf

    Java 锁是 Java 并发编程中的一种基本机制,用于确保线程安全和避免竞争条件。Java 锁可以分为两大类:synchronized 锁和 ReentrantLock 锁。 一、Synchronized 锁 1. 锁的原理:synchronized 锁是基于对象头的 ...

    java中锁知识的整理,文件是.xmind思维导图

    适合已经学过锁这方面知识的小伙伴进行学习,思维导图对各种锁进行了详细整理总结,采用思维导图的方式更加方便大伙们学习并记忆。

    java锁机制Synchronizedjava锁机制Synchronized

    Java 锁机制 Synchronized 是 Java 语言中的一种同步机制,用于解决多线程并发访问共享资源时可能出现的一些问题。 Java 锁机制 Synchronized 的概念 在 Java 中,每个对象都可以被看作是一个大房子,其中有多个...

    Java中锁的实现和内存语义浅析

    在Java并发编程中,锁的实现和内存语义是实现线程安全的关键机制之一。锁的机制能够保证在多线程环境中,对于共享资源的访问互斥执行,防止出现数据竞争和条件竞争的问题。而内存语义涉及到线程间如何通过主内存和...

    Java 中的悲观锁和乐观锁的实现

    ### Java中的悲观锁与乐观锁实现详解 #### 一、悲观锁(Pessimistic Locking) 悲观锁是一种基于对数据安全性的保守态度而设计的锁机制。它假设数据在处理过程中很可能被外界修改,因此在整个数据处理过程中都会将...

    java锁的释放与建立

    总之,Java锁的释放与建立是多线程编程中的核心概念,它们与_happens-before_关系紧密相连,确保了线程间的正确通信和数据一致性。正确理解和运用这些机制,能有效避免并发问题,提高程序的稳定性和性能。

    Java的锁机制的学习和使用

    #### 一、Java锁机制概览 Java中的锁机制主要用于解决多线程环境下的资源竞争问题。在并发编程中,为了保证数据一致性与正确性,通常需要采用各种锁来控制对共享资源的访问。Java语言提供了多种锁机制,包括`...

    Java中的锁分类与使用.docx

    Java中的锁机制是多线程编程中不可或缺的一部分,它们用于管理对共享资源的并发访问,确保数据的一致性和完整性。本文将深入探讨Java中的几种主要锁类型及其使用。 1. **乐观锁**与**悲观锁** - **乐观锁**假设...

    4种常用Java线程锁的特点,性能比较、使用场景.pdf

    4种常用Java线程锁的特点,性能比较、使用场景 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发...

    Java中的锁分类的详细介绍

    Java 中的锁分类可以分为多种类型,包括公平锁、非公平锁、可重入锁、独享锁、共享锁、互斥锁、读写锁、乐观锁、悲观锁、分段锁、偏向锁、轻量级锁、重量级锁、自旋锁等。这些锁的分类并不是指锁的状态,有的指锁的...

Global site tag (gtag.js) - Google Analytics