【Java 并发编程】线程锁机制 ( 线程安全 | 锁机制 | 类锁 | 对象锁 | 轻量级锁 | 重量级锁 )
文章目录
- 一、线程安全
- 二、锁机制 ( 类锁 | 对象锁 )
- 三、锁分类 ( 轻量级锁 | 重量级锁 )
一、线程安全
多个线程同时访问 同一个共享变量 时 , 只要能保证 数据一致性 , 那么该变量是线程安全的 ; 这里的数据是指主内存中的共享变量以及各个线程中的变量副本 , 保证这些变量一致 , 就是线程安全 ;
线程安全 就是保证 线程操作的 原子性 , 可见性 , 有序性 ;
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 并发编程】线程锁机制 ( 线程安全 | 锁机制 | 类锁 | 对象锁 | 轻量级锁 | 重量级锁 )相关推荐
- 《Java并发编程的艺术》——线程(笔记)
文章目录 四.Java并发编程基础 4.1 线程简介 4.1.1 什么是线程 4.1.2 为什么要使用多线程 4.1.3 线程优先级 4.1.4 线程的状态 4.1.5 Daemon线程 4.2 启动 ...
- Java 并发编程——Executor框架和线程池原理
Java 并发编程系列文章 Java 并发基础--线程安全性 Java 并发编程--Callable+Future+FutureTask java 并发编程--Thread 源码重新学习 java并发 ...
- Java并发编程|第二篇:线程生命周期
文章目录 系列文章 1.线程的状态 2.线程生命周期 3.状态测试代码 4.线程终止 4.1 线程执行完成 4.2 interrupt 5.线程复位 5.1interrupted 5.2抛出异常 6. ...
- [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ...
[Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ... 摘要 介绍 Java 并发包里的几个主要 ExecutorService . 正文 ...
- [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors...
[Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...
- 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池
并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...
- Java并发编程(08):Executor线程池框架
本文源码:GitHub·点这里 || GitEE·点这里 一.Executor框架简介 1.基础简介 Executor系统中,将线程任务提交和任务执行进行了解耦的设计,Executor有各种功能强大的 ...
- Java并发编程(8)——常见的线程安全问题
线程安全问题: 多个线程同时执行也能工作的代码就是线程安全的代码 如果一段代码可以保证多个线程访问的时候正确操作共享数据,那么它是线程安全的. 具体说明: java并发线程实战(1) 线程安全和机制原 ...
- Java并发编程:进程、线程、并行与并发
一谈到Java并发编程,我们一般就会联想起进程.线程.并行.并发等等概念.那么这些概念都代表什么呢?进程与线程有什么关系?并发与并行又是什么关系呢? 01 进程与线程 进程是指程序的一次动态执行过程, ...
- Java并发编程:进程和线程之由来
2019独角兽企业重金招聘Python工程师标准>>> Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编 ...
最新文章
- Redis数据库搭建集群(集群概念、redis集群、搭建集群(配置机器1、2、创建集群、数据操作验证)、Python与redis集群交互)
- 对ASCII文件的操作
- vue的递归组件以及三级菜单的制作
- 敏捷开发系列学习总结(13)——Spotify敏捷模式详解三部曲第一篇:研发团队
- 了解SQL Server数据库静态数据及其如何适合数据库生命周期管理
- Centos7安装Python3的方法
- javaCV开发详解之7:让音频转换更加简单,实现通用音频编码格式转换、重采样等音频参数的转换功能(以pcm16le编码的wav转mp3为例)...
- 高程数据的下载以及运用高程数据进行坡度和坡向的计算
- 共空间模式算法(CSP)
- 【ECS】云服务器ECS是什么
- 高科技玩具这么无趣,为何还要鼓励孩子玩?
- 党² - 李超线段树
- 关于De-pCode在线工具失效的问题
- 头歌-信息安全技术-【实训10】HTML信息隐藏、动态分析技术
- 攻防世界(动态调试题)
- 【好奇心驱动力】e-paper电子价签从零开始折腾记录
- Exynos4412 移植针对Samsung的Linux-6.1(二)SD卡驱动——解决无法挂载SD卡的根文件系统
- 【转】互联网金融产品需要什么样的产品经理?
- 如何进入Google工作? Google招聘流程介绍
- 智汇云舟参编《工业数字孪生白皮书(2021)》成为工业互联网联盟“工业解决方案备选提供商”
热门文章
- 11个有用的移动网页开发App和HTML5框架
- Entity Framework 实体关系总结:one-to-one, one-to-many, many-to-many
- linux 中php以及nginx的重启命令
- atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97
- Android而一个超级漂亮的日历控件
- 组队开发第二周第一次会议
- 扩展js string 方法
- cvReleaseImage出错
- Kafka(1)-概述
- jQuery练习---- 超简单的表格悬停变色Demo