美文网首页
多线程juc锁

多线程juc锁

作者: 王哈哈哈哈哈 | 来源:发表于2019-04-17 09:46 被阅读0次

java_basic

1 线程安全

在Java多线程编程当中,实现线程安全:

  1. 内部锁(Synchronized)和显式锁(Lock):属于互斥同步方法,是重量级的多线程同步机制,可能会引起上下文切换和线程调度,它同时提供内存可见性、有序性和原子性。
  2. volatile:轻量级多线程同步机制,不会引起上下文切换和线程调度。仅提供内存可见性、有序性保证,不提供原子性。
  3. CAS原子指令:属于非阻塞同步方法,轻量级多线程同步机制,不会引起上下文切换和线程调度。它同时提供内存可见性、有序性和原子化更新保证。

synchronized锁与volatile变量的比较

volatile变量最大的优点是使用方便。在某些情形下,使用volatile变量要比使用相应的synchronized锁简单得多。
某些情况下,volatile变量同步机制的性能要优于synchronized锁。
volatile变量不会像synchronized锁一样造成阻塞。
volatile变量最大的缺点在于使用范围有限,而且容易出错。

锁概述

Lock
Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。  
AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer
AbstractQueuedSynchronizer就是被称之为AQS的类为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量、事件,等等)提供一个框架
Condition
Condition又称等待条件,它实现了对锁更精确的控制 Condition中的await()方法相当于Object的wait()方法,
Condition中的signal()方法相当于Object的notify()方法,Condition中的signalAll()相当于Object的notifyAll()方法。
不同的是,Object中的wait(),notify(),notifyAll()方法是和synchronized组合使用的;而Condition需要与Lock组合使用。
ReentrantReadWriteLock
ReentrantReadWriteLock维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。
LockSupport
用来创建锁和其他同步类的基本线程阻塞原语。
CountDownLatch
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
CyclicBarrier
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点。
Semaphore
一个计数信号量。从概念上讲,信号量维护了一个许可集。Semaphore通常用于限制可以访问某些资源的线程数目。
AQS,AbstractQueuedSynchronizer的缩写
AQS支持两种资源访问方式,独占模式(Exclusive)和共享模式(Share)
Lock与ReentrantLock

synchronized为隐式锁,而使用Lock时则相反,所以一般称Lock为显示锁
Lock实现比synchronized更灵活
ReentrantLock是一个可重入的互斥锁
ReentrantLock既可以是公平锁又可以是非公平锁

AQS
Condition

精细地控制线程的休眠与唤醒的。

ReentrantReadWriteLock

ReentrantReadWriteLock是支持与ReentrantLock 类似语义的ReadWriteLock实现。
ReadWriteLock维护了两个锁,读锁和写锁,写锁是独占的。读锁是共享的
共享数据很大,且读操作远多于写操作的情况下,读写锁值得一试。
特性: 公平性
重入性
锁降级
锁获取中断
支持Condition
检测系统状态

LockSupport

LockSupport的park()和unpark()方法分别用于阻塞线程和解除阻塞线程

StampedLock
CountDownLatch

CountDownLatch是一个通用同步器,用于同步一个或多个任务。在完成一组正在其他线程中执行的任务之前,它允许一个或多个线程一直等待。
启动 关闭开关

CyclicBarrier

允许一组线程互相等待,直到到达某个公共屏障点。如果你希望一组并行的任务在下个步骤之前相互等待,直到所有的任务都完成了下个步骤前的所有操作,才继续向前执行,那么CyclicBarrier很合适

Semaphore

一般的锁在任意时刻只允许一个线程访问一项资源,而计数信号量允许n个任务同时访问一项资源。我们可以将信号量看做一个许可集,可以向线程分发使用资源的许可证。获得资源前,线程调用acquire()从许可集中获取许可。该线程结束后,通过release()将许可还给许可集。

相关文章

  • 2018-07-26 CountDownLatch

    【转】Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例

  • 多线程juc锁

    java_basic 1 线程安全 在Java多线程编程当中,实现线程安全: 内部锁(Synchronized...

  • JUC学习笔记三

    JUC学习笔记三 用于解决多线程同步问题的方式 隐式锁(synchronized) 同步代码块 同步方法 显式锁(...

  • JUC源码循序渐进

    目录 必读篇 JUC源码分析—CAS和Unsafe JUC源码分析—AQS JUC锁篇 JUC源码分析-JUC锁(...

  • JUC解析-原子操作

    JUC是java.util.concurrent包的简称,主要包含了jdk中多线程相关的技术,例如锁、信号、线程安...

  • JUC之多线程锁问题

    多线程锁 8种问题锁状态: 该部分全部围绕的是以下内容并结合相应的例子:synchronized实现同步的基础:J...

  • JUC原理之Semaphore

    Semaphore的应用场景 Semaphore是JUC包内的一个多线程协调工具,是共享锁的一种实现,非常适合解决...

  • 实战java高并发程序设计第四章-锁优化(一)

    前言:java 多线程锁的优化一直是难点!如果优化的好,性能会高很多,比如 jdk 里面提供了很多 juc 的类,...

  • Go并发编程之美-CAS操作

    摘要:一、前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁...

  • Go并发编程之美-互斥锁

    一、前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CA...

网友评论

      本文标题:多线程juc锁

      本文链接:https://www.haomeiwen.com/subject/pekgwqtx.html