IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 每天学习一点点211128--线程同步 -> 正文阅读

[Java知识库]每天学习一点点211128--线程同步

线程同步

  1. 线程同步机制简介
    ??线程同步机制是一套用于协调线程之间的数据访问的机制,该机制可以保障线程安全。
    Java 平台提供的线程同步机制包括:锁,volatile 关键字,final 关键字,static 关键字以及相关的API,如 Object.wait() / Object.notify()等。
  2. 锁概述
    ??线程安全问题产生的前提是多个线程并发访问共享数据。
    ??将多个线程对共享数据的并发访问转换为串行访问,即一个共享数据一次只能被一个线程访问。锁就是用这种思路来保障线程安全的。
    ??锁(Lock)可以理解为对共享数据进行保护的一个许可证。对于同一个许可证保护的共享数据来说,任何线程想要访问这些共享数据必须先持有该许可证,一个线程只有在持有许可证的情况下才能对这些共享数据进行访问,并且一个许可证一次只能被一个线程持有,许可证线程在结束对共享数据的访问后必须释放其持有的许可证。
    ??线程在访问共享数据前必须先获得锁,获得锁的线程称为锁的持有线程,一个锁一次只能被一个线程持有。锁的持有线程在获得锁之后和释放锁之前这段时间执行的代码称为临界区(Critical Section)。
    ??锁具有排他性(Exclusive),即一个锁一次只能被一个线程持有,这种锁称为排他锁或互斥锁(Mutex)。
    ??JVM 把锁分为内部锁和显示锁两种。内部锁通过 synchronized 关键字实现;显示锁通过 java.concurrent.locks.Lock 接口的实现类实现。
    1. 锁的作用
      ??锁可以实现对共享数据的安全访问,保障线程的原子性,可见性与有序性。
      ??锁是通过互斥保障原子性。一个锁只能被一个线程持有,这就保证临界区的代码一次只能被一个线程执行,使得临界区代码所执行的操作自然而然的具有不可分割的特性,即具备了原子性。
      ??可见性的保障是通过写线程冲刷处理器的缓存和读线程刷新处理器缓存这两个动作实现的。在 java 平台中,锁的获得隐含着刷新处理器缓存的动作,锁的释放隐含着冲刷处理器缓存的工作。
      ??锁能够保障有序性。写线程在临界区所执行的在读线程所执行的临界区看来象是完全按照源码顺序执行的。
      使用锁保障线程的安全性,必须满足以下条件:
      ??这些线程在访问共享数据时必须使用同一个锁
      ??即使是读取共享数据的线程也需要使用同步锁
    2. 锁相关的概念
      1. 可重入性
        ??一个线程持有该锁的时候能再次申请该锁
        ??如果一个线程持有一个所得时候还能够继续成功申请该锁,称该锁是可重入的,否则就称该锁为不可重入的。
      2. 锁的争用与调度
        ??Java 平台中内部锁属于非公平锁,显示 Lock 锁既支持公平锁又支持非公平锁。
      3. 锁的粒度
        ??一个锁可以保护的共享数据的数量大小称为锁的粒度。
        ??锁保护共享数据量大,称该锁的粒度粗,否则就称该锁的粒度细。
        ??锁的粒度过粗会导致线程在申请锁时会进行不必要的等待,锁的粒度过细会增加锁调度的开销。
  3. 内部锁:synchronized 关键字
  4. 轻量级同步机制:volatile 关键字
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-30 15:28:34  更:2021-11-30 15:31:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:23:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码