文章目录

  • 一、线程安全
  • 二、锁机制 ( 类锁 | 对象锁 )
  • 三、锁分类 ( 轻量级锁 | 重量级锁 )

一、线程安全


多个线程同时访问 同一个共享变量 时 , 只要能保证 数据一致性 , 那么该变量是线程安全的 ; 这里的数据是指主内存中的共享变量以及各个线程中的变量副本 , 保证这些变量一致 , 就是线程安全 ;

线程安全 就是保证 线程操作的 原子性 , 可见性 , 有序性 ;

volatile 关键字可以保证 可见性 与 有序性 ;

synchronized 关键字可以保证 原子性 ;

二、锁机制 ( 类锁 | 对象锁 )


synchronized 是 Java 提供的一种锁机制 ;

在普通方法上加锁 , 相当于对 this 进行加锁 ; 下面两个类的 fun 方法的线程锁是等效的 ;

public class Student {private synchronized void fun() {}
}
public class Student {private void fun() {synchronized(this){}}
}

加锁的代码块 , 在同一个时间 , 只能由 111 个线程访问 ;

对象锁 : synchronized() 代码块中 , 括号中的参数是 作用范围 ; synchronized(this) 表示作用范围只针对当前对象 , 如果 创建了多个对象 , 这几个对象中的锁都是 不同的锁 , 相互之间没有任何关系 ;

Student s1 = new Student();
Student s2 = new Student();

只有当多个线程 , 访问同一个对象时 , 锁才有意义 ;

如 :
线程 A 访问 s1 对象的 fun 方法 , 线程 B 访问 s2 对象的 fun 方法 , 两个方法之间 没有互斥效果 ;
线程 A 访问 s1 对象的 fun 方法 , 线程 B 也想访问 s1 对象的 fun 方法 , 此时必须 等待线程 A 访问完毕 , 释放锁之后 , 才能由线程 B 访问 s1 ;

类锁 : 如果加锁的对象是静态方法 , 那么相当于在 Student.class 类上进行加锁 ; Student.class 对象全局只有 111 个 , 调用所有对象的 fun 方法 , 都是互斥的 ;

public class Student {private synchronized static void fun() {}
}

等价于

public class Student {private static void fun() {synchronized(Student.class){}}
}

三、锁分类 ( 轻量级锁 | 重量级锁 )


如果线程 A 获得锁之后 , 执行线程内容 , 其它线程等待解锁时有两种情况 :

  • 轻量级锁 : 又称为 自旋锁 , 线程 盲等待 或 自旋等待 , 即 while 循环 , 没有进入阻塞状态 , 没有进入等待队列中排队 ; ( 轻量级 )
  • 重量级锁 : 线程进入 等待队列 , 排队等待线程 A 执行完毕 ; 在该队列的线程 , 需要 等待 OS 进行线程调度 , 一旦涉及到操作系统 , 量级就变重 , 效率变低 ; ( 重量级 )

轻量级锁弊端 : 轻量级锁 不一定 比重量级锁 更好 ; 轻量级锁 等待过程中 , 高速执行循环代码 , 如果循环的时间很短 , 时间效率上很高 ; 但是一旦执行时间很长 , 比如连续执行十几秒甚至几分钟 , 浪费了大量的 CPU 资源 ;

使用场景 :

  • 轻量级锁 : 轻量级锁只适合 线程少 , 等待时间短的 应用场景 , 如果线程很多 , 等待时间过长 , 会造成 CPU 大量浪费 ;
  • 重量级锁 : 重量级锁等待过程中 , 线程处于阻塞状态 , 效率可能低一些 , 但是不会造成资源浪费 , 如果 线程很多 , 或 等待时间很长 , 适合使用重量级锁 ;

【Java 并发编程】线程锁机制 ( 线程安全 | 锁机制 | 类锁 | 对象锁 | 轻量级锁 | 重量级锁 )相关推荐

  1. 《Java并发编程的艺术》——线程(笔记)

    文章目录 四.Java并发编程基础 4.1 线程简介 4.1.1 什么是线程 4.1.2 为什么要使用多线程 4.1.3 线程优先级 4.1.4 线程的状态 4.1.5 Daemon线程 4.2 启动 ...

  2. Java 并发编程——Executor框架和线程池原理

    Java 并发编程系列文章 Java 并发基础--线程安全性 Java 并发编程--Callable+Future+FutureTask java 并发编程--Thread 源码重新学习 java并发 ...

  3. Java并发编程|第二篇:线程生命周期

    文章目录 系列文章 1.线程的状态 2.线程生命周期 3.状态测试代码 4.线程终止 4.1 线程执行完成 4.2 interrupt 5.线程复位 5.1interrupted 5.2抛出异常 6. ...

  4. [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ...

    [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ... 摘要 介绍 Java 并发包里的几个主要 ExecutorService . 正文 ...

  5. [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors...

    [Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...

  6. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

  7. Java并发编程(08):Executor线程池框架

    本文源码:GitHub·点这里 || GitEE·点这里 一.Executor框架简介 1.基础简介 Executor系统中,将线程任务提交和任务执行进行了解耦的设计,Executor有各种功能强大的 ...

  8. Java并发编程(8)——常见的线程安全问题

    线程安全问题: 多个线程同时执行也能工作的代码就是线程安全的代码 如果一段代码可以保证多个线程访问的时候正确操作共享数据,那么它是线程安全的. 具体说明: java并发线程实战(1) 线程安全和机制原 ...

  9. Java并发编程:进程、线程、并行与并发

    一谈到Java并发编程,我们一般就会联想起进程.线程.并行.并发等等概念.那么这些概念都代表什么呢?进程与线程有什么关系?并发与并行又是什么关系呢? 01 进程与线程 进程是指程序的一次动态执行过程, ...

  10. Java并发编程:进程和线程之由来

    2019独角兽企业重金招聘Python工程师标准>>> Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编 ...

最新文章

  1. Redis数据库搭建集群(集群概念、redis集群、搭建集群(配置机器1、2、创建集群、数据操作验证)、Python与redis集群交互)
  2. 对ASCII文件的操作
  3. vue的递归组件以及三级菜单的制作
  4. 敏捷开发系列学习总结(13)——Spotify敏捷模式详解三部曲第一篇:研发团队
  5. 了解SQL Server数据库静态数据及其如何适合数据库生命周期管理
  6. Centos7安装Python3的方法
  7. javaCV开发详解之7:让音频转换更加简单,实现通用音频编码格式转换、重采样等音频参数的转换功能(以pcm16le编码的wav转mp3为例)...
  8. 高程数据的下载以及运用高程数据进行坡度和坡向的计算
  9. 共空间模式算法(CSP)
  10. 【ECS】云服务器ECS是什么
  11. 高科技玩具这么无趣,为何还要鼓励孩子玩?
  12. 党² - 李超线段树
  13. 关于De-pCode在线工具失效的问题
  14. 头歌-信息安全技术-【实训10】HTML信息隐藏、动态分析技术
  15. 攻防世界(动态调试题)
  16. 【好奇心驱动力】e-paper电子价签从零开始折腾记录
  17. Exynos4412 移植针对Samsung的Linux-6.1(二)SD卡驱动——解决无法挂载SD卡的根文件系统
  18. 【转】互联网金融产品需要什么样的产品经理?
  19. 如何进入Google工作? Google招聘流程介绍
  20. 智汇云舟参编《工业数字孪生白皮书(2021)》成为工业互联网联盟“工业解决方案备选提供商”

热门文章

  1. 11个有用的移动网页开发App和HTML5框架
  2. Entity Framework 实体关系总结:one-to-one, one-to-many, many-to-many
  3. linux 中php以及nginx的重启命令
  4. atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97
  5. Android而一个超级漂亮的日历控件
  6. 组队开发第二周第一次会议
  7. 扩展js string 方法
  8. cvReleaseImage出错
  9. Kafka(1)-概述
  10. jQuery练习---- 超简单的表格悬停变色Demo