Java多线程:“JUC锁”01之框架

根据锁的添加到Java中的时间,Java中的锁,可以分为"同步锁"和 "JUC包中的锁"。

同步锁

即通过synchronized关键字来进行同步,实现对竞争资源的互斥访问的锁。Java 1.0版本中就已经支 持同步锁了。

同步锁的原理是,对于每一个对象,有且仅有一个同步锁;不同的线程能共同访问该同步锁。但是, 在同一个时间点,该同步锁能且只能被一个线程获取到。这样,获取到同步锁的线程就能进行CPU调度, 从而在CPU上执行;而没有获取到同步锁的线程,必须进行等待,直到获取到同步锁之后才能继续运行。 这就是,多线程通过同步锁进行同步的原理!

关于"同步锁"的更多内容,请参考"Java锁的基础部分"的内容。

JUC包中的锁

相比同步锁,JUC包中的锁的功能更加强大,它为锁提供了一个框架,该框架允许更灵活地使用锁,只 是它的用法更难罢了。

JUC包中的锁,包括:Lock接口,ReadWriteLock接口,LockSupport阻塞原语,Condition条件, AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer三个抽 象类,ReentrantLock独占锁,ReentrantReadWriteLock读写锁。由于CountDownLatch,CyclicBarrier和 Semaphore也是通过AQS来实现的;因此,我也将它们归纳到锁的框架中进行介绍。

先看看锁的框架图,如下所示。

01. Lock接口

JUC包中的 Lock 接口支持那些语义不同(重入、公平等)的锁规则。所谓语义不同,是指锁可是有 "公平机制的锁"、"非公平机制的锁"、"可重入的锁"等等。"公平 机制"是指"不同线程获取锁的机制是公平的",而"非公平机制"则是指" 不同线程获取锁的机制是非公平的","可重入的锁"是指同一个锁能够被一个线程多次获 取。

时间: 2024-08-03 09:26:20

Java多线程:“JUC锁”01之框架的相关文章

Java 多线程同步 锁机制与synchronized深入解析_java

打个比方:一个object就像一个大房子,大门永远打开.房子里有很多房间(也就是方法).这些房间有上锁的(synchronized方法), 和不上锁之分(普通方法).房门口放着一把钥匙(key),这把钥匙可以打开所有上锁的房间.另外我把所有想调用该对象方法的线程比喻成想进入这房子某个 房间的人.所有的东西就这么多了,下面我们看看这些东西之间如何作用的. 在此我们先来明确一下我们的前提条件.该对象至少有一个synchronized方法,否则这个key还有啥意义.当然也就不会有我们的这个主题了. 一

Java多线程-线程的同步与锁的问题_java

一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. package cn.thread; public class Foo { private int x = 100; public int getX() { return x; } public int fix(int y) { x = x - y; return x; } } package cn.thread

Java多线程:“JUC锁”03之公平锁(一)

基本概念 本章,我们会讲解"线程获取公平锁"的原理:在讲解之前,需要了解几个基本概念.后 面的内容,都是基于这些概念的:这些概念可能比较枯燥,但从这些概念中,能窥见"java锁 "的一些架构,这对我们了解锁是有帮助的. 1. AQS        -- 指AbstractQueuedSynchronizer类. AQS 是java中管理"锁"的抽象类,锁的许多公共方法都是在这个类中实现.AQS是独占锁(例如, ReentrantLock)和共享锁

Java多线程:“JUC锁”04之公平锁(二)

概要 前面一章,我们学习了"公平锁"获取锁的详细流程:这里,我们再来看看"公平锁 "释放锁的过程.内容包括: 参考代码 释放公平锁(基于JDK1.7.0_40) "公平锁"的获取过程请参考"Java多线程系列--"JUC锁"03之 公平锁 (一)",锁的使用示例请参考"Java多线程系列--"JUC锁"02之 互斥锁 ReentrantLock". 注意: (01)

Java多线程:“JUC锁”02之互斥锁ReentrantLock

ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为"独占锁". 顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有:而可重入的意思是, ReentrantLock锁,可以被单个线程多次获取. ReentrantLock分为"公平锁"和"非 公平锁".它们的区别体现在获取锁的机制上是否公平."锁"是为了保护竞争资源, 防止多个线程同时操作线程而出错,ReentrantL

Java多线程:“基础篇”01之基本概念

多线程是Java中不可避免的一个重要主体.从本章开始,我们将展开对多线程的学习.接下来的内容 ,是对"JDK中新增JUC包"之前的Java多线程内容的讲解,涉及到的内容包括,Object类中的 wait(), notify()等接口:Thread类中的接口:synchronized关键字. 注:JUC包是指,Java.util.concurrent包,它是由Java大师Doug Lea完成并在JDK1.5版本添加到 Java中的. 在进入后面章节的学习之前,先对了解一些多线程的相关概念

Java多线程同步问题的探究(三、Lock来了,大家都让开【1.认识重入锁】)

在上一节中,我们已经了解了Java多线程编程中常用的关键字synchronized,以及与之相关的对象锁机制.这一节中,让我们一起来认 识JDK 5中新引入的并发框架中的锁机制. 我想很多购买了<Java程序员面试宝典>之类图书的朋友一定对下面这个面试题感到非常熟悉: 问:请对比synchronized与java.util.concurrent.locks.Lock 的异同. 答案:主要相同点:Lock能完成synchronized所实现的所有功能 主要不同点:Lock有比synchroniz

Java多线程:“JUC原子类”03之AtomicLongArray原子类

AtomicLongArray介绍和函数列表 在"Java多线程系列--"JUC原子类"02之 AtomicLong原子类"中介绍过, AtomicLong是作用是对长整形进行原子操作.而AtomicLongArray的作用则是对"长整形数组" 进行原子操作. AtomicLongArray函数列表 // 创建给定长度的新 AtomicLongArray. AtomicLongArray(int length) // 创建与给定数组具有相同长度的

Java多线程同步问题的探究(二、给我一把锁,我能创造一个规矩)

在上一篇中,我们讲到了多线程是如何处理共享资源的,以及保证他们对资源进行互斥访问所依赖的重要机制:对象锁. 本篇中,我们来看一看传统的同步实现方式以及这背后的原理. 很多人都知道,在Java多线程编程中,有一个重要的关键字,synchronized.但是很多人看到这个东西会感到困惑:"都说同步机制是 通过对象锁来实现的,但是这么一个关键字,我也看不出来Java程序锁住了哪个对象阿?" 没错,我一开始也是对这个问题感到困惑和不解.不过还好,我们有下面的这个例程: 1 public cla