`

java锁的概念

 
阅读更多

排它锁和共享锁:synchronized、ReentrantLock属于排它锁,ReentrantReadWriteLock写锁也是排它的,共享锁(ReentrantReadWriteLock的读锁)

可重入锁:比如一个对象中,有方法1和方法2被synchronized修饰,方法1内部可调用方法2,就叫作可重入。另外,ReentrantLock也可以。原理:比如ReentrantLock,其实因为加锁的是同一个对象,所以只需要把锁的计数器状态+1,退出一个锁就-1,直到所有锁都退出。像ConcurrentHashMap的Segment就继承了ReentrantLock。

ReentrantReadWriteLock等非重入锁,不能在获取读锁时再获取写,会死循环。但写锁中可以获取读锁。

 

公平和非公平:ReentrantLock实现这两种(new ReentrantLock(isFair);),默认是非公平锁。其中公平锁遵循FIFO先进先出,即按照线程启动的顺序执行。而非公平锁是抢占式的,大家都知道锁释放和唤醒其他线程从挂起回复到RUNNABLE状态,这需要一定时间,如果这个时候有其他线程直接就获取到锁并执行,就可以省去这段时间消耗,所以非公平更优化。但读写锁中,读并发高,是不是就很难获取到写锁,不是的,其实现是优先写机制(具体情况待续...)。

 

阻塞和非阻塞:即调用方法执行时,如果获取锁失败,继续等待直到加锁成功叫阻塞;若立即返回就叫非阻塞。

 

Condition:线程之间的通信,Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过该对象与任意 Lock 实现组合使用,为每个对象提供多个设置等待的地方(只需要调用该对象成员变量Condition的方法),Condition 替代了 Object 监视器方法的使用。

 

Unsafe类:提供了硬件级别的原子操作。

1)可以分配内存,可以释放内存

2)可以定位对象某字段的内存位置,也可以修改对象的字段值,即使它是私有的;

3)将一个线程进行挂起或恢复。

4)CAS操作,是通过compareAndSwapXXX方法实现的,有3个操作数,内存值M,预期值E,新值U,如果M==E,则修改内存值

 

乐观、悲观锁:cas是乐观的,操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。

 

mysql中,也有共享锁和排它锁的概念,其中,update,delete和insert会自动对相应数据加上排它锁,普通select没有加任何锁,可通过select ... for update.来加排它锁,也可通过select ... lock in share mode加共享锁(多个线程都可以读,但只要有一个读锁,就不能进行写)。

 

 

锁的对比:

synchronized+ReentrantLock:由于synchronized是在JVM层面实现的,因此系统可以监控锁的释放与否,而ReentrantLock使用代码实现的,系统无法自动释放锁,需要在代码中finally子句中显式释放锁lock.unlock();

synchronized释放锁:1)线程获取锁的线程执行完了该代码块,然后线程释放对锁的占有;2)线程执行发生异常,此时JVM会让线程自动释放锁。另外因为是底层实现,线程获取锁阻塞,也会阻塞到其他要获取锁的线程。

ReentrantLock:由代码实现,初始化时new可选择公平或非公平锁,线程获取锁时可快速失败,但必须手动关闭锁。

 

分享到:
评论

相关推荐

    java锁机制Synchronizedjava锁机制Synchronized

    Java 锁机制 Synchronized 的概念 在 Java 中,每个对象都可以被看作是一个大房子,其中有多个房间(方法)。这些房间可以被分为两种:上锁房间(synchronized 方法)和不上锁房间(普通方法)。每个对象都有一个...

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

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

    java锁的释放与建立

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

    Java锁机制详解.pdf

    Java锁机制是Java多线程编程中的核心概念之一,其主要目的是确保在多线程环境下,多个线程能够安全地访问共享资源,避免数据不一致的问题。Java锁机制的发展历经了多个版本的改进,尤其是Java 5.0引入的显示锁...

    java 读写锁代码

    1. **读写锁概念**: - 读写锁分为读锁(共享锁)和写锁(独占锁)。读锁允许多个线程同时读取数据,而写锁只允许一个线程进行写操作。 - 当一个线程持有写锁时,其他线程无法获取读锁或写锁,保证了写操作的互斥...

    java锁机制详解.pdf

    Java锁机制是多线程编程中的关键概念,用于控制对共享资源的并发访问。在Java中,主要的锁机制包括`synchronized`关键字和`Lock`接口(如`ReentrantLock`)。下面将详细讲解这两种锁机制及其应用。 1. `...

    java-syn.zip_Java syn_Java syn锁_java同步锁syn_java锁 syn_syn同步事务锁

    4. **Java锁的类型**: - **内置锁**:也称为监视器锁,由`synchronized`关键字提供。 - **显式锁**:如`java.util.concurrent.locks.Lock`接口及其实现,如`ReentrantLock`,提供了更复杂的锁操作,如可中断锁...

    JAVA锁的膨胀过程-分析-适合Java新手道架构师

    JAVA 对象头和 Monitor 是两个重要的概念。JAVA 对象头主要包括两部分数据:Mark Word(标记字段)和 Class Pointer(类型指针)。Mark Word 默认存储对象的 HashCode、分代年龄和锁标志位信息。而 Class Pointer 是...

    java锁各种核心整理

    Java锁机制是多线程编程中非常重要的概念,它确保了数据的一致性和线程之间的同步。在Java中,锁的机制主要可以分为乐观锁和悲观锁两大类,此外还包括自旋锁、Synchronized同步锁和可重入锁等,下面将详细介绍这些...

    一个简单的java类,说明了锁的粒度

    在Java编程语言中,线程同步是多线程编程中的一个重要概念,用于控制对共享资源的访问,以避免数据不一致性和竞态条件。锁是实现线程同步的一种机制,而锁的粒度则决定了锁保护的代码范围,进而影响程序的并发性能。...

    java的Lock锁原理详解.docx

    Java中的锁机制是多线程编程中至关重要的一个概念,用于协调多个线程对共享资源的访问。在Java中,有两种主要的锁机制:synchronized和Lock。它们都是用来实现线程同步,防止数据竞争,确保并发环境下的数据一致性。...

    Java多线程完全概念题

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了代码的并发性和效率。在面试中,了解并掌握多线程的基本概念和技术是至关重要的。以下是一些关于Java多线程的关键知识点: 1. **线程同步**...

    Beginning Java Objects 中文版从概念到代码(扫描版)网上找不到的哦

    根据提供的文件信息,我们可以推断出这是一本关于Java编程的书籍,名为《Beginning Java Objects》的中文版,从概念到代码的全面介绍,并且这本书是通过扫描制作成PDF格式的电子版本。以下是对该书可能包含的重要...

    Java锁的知识总结及实例代码共7页.pdf.zip

    Java锁是Java多线程编程中的重要概念,用于控制对共享资源的并发访问,以确保数据的一致性和正确性。本资料"Java锁的知识总结及实例代码共7页.pdf.zip"详细介绍了Java锁的原理、类型以及实际应用,旨在帮助开发者...

    Java分布式锁的概念与实现方式详解

    "Java分布式锁的概念与实现方式详解" Java分布式锁是指在分布式环境下,多台计算机上的多个线程需要访问同一个变量或代码片段时,控制这些线程的访问顺序,以避免并发问题的机制。普通的锁只能在单机多线程环境下...

    关于读写锁算法的Java实现及思考

    关于读写锁算法的Java实现及思考,是一个深入探讨了多线程...通过本文的讲解,我们不仅学习到了读写锁的基本概念,也深入探讨了其在Java中的具体应用和自定义实现,这对于提高软件开发中的并发编程能力具有重要意义。

    java文件锁的实现

    在Java编程语言中,文件锁是一种用于控制对文件进行并发访问的重要机制。它允许一个或多个进程在同一时间对文件的特定部分进行独占访问,从而防止数据的不一致性。本篇将深入探讨Java中文件锁的实现,以及如何在实际...

    JAVA锁的膨胀过程和优化.docx

    本文将详细介绍Java锁的膨胀过程和优化策略。 首先,我们来看自旋锁。自旋锁是一种优化策略,当一个线程尝试获取已被其他线程持有的锁时,它并不会立即阻塞,而是会进行一次忙循环,持续检查锁是否已释放。如果持有...

Global site tag (gtag.js) - Google Analytics