| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 锁 & synchronized 关键字 -> 正文阅读 |
|
[Java知识库]锁 & synchronized 关键字 |
本篇接着上篇 线程安全,可以先看一下上篇~~ 锁锁 是什么?举例理解: 锁的特点:锁的特点是互斥的,同一时刻只有一个线程能获取到锁,其他的线程若也尝试获取锁,就会发生阻塞等待,一旦发生等待,需一直等到刚才的线程释放锁,此时剩下的线程再重新竞争锁 锁的基本操作:1.加锁(获取锁) — lock 锁的使用synchronized 关键字 — 监视器锁Java 中使用锁,需要借助关键字 synchronized 例如,上边自增的例子,我们可以在方法前加这个关键字:
此时就是:进入 increase 方法前,会先尝试加锁;increase 方法执行完毕后,就会自动解锁 此时,看运行结果:
线程 在获取到锁之后,如果出问题(因为其他原因导致长时间的阻塞),此时,其他线程也只能"干瞪眼"~ 死锁中非常经典的案例:哲学家进餐问题 锁,用起来没那么容易,存在很多注意事项:
之前所学习的 StringBuffer 是线程安全的,StringBuilder 是线程不安全的,换句话说,也就是 StringBuffer 内部加锁了,同样,还有 Vector(🔒) / ArrayList ,HashTable(🔒) / HashMap 理解 synchronized 的具体使用:可以灵活的指定某个对象来加锁,而不仅仅是把锁加到某个方法上 画图理解:
synchronized 的几种常见用法:1.加到普通方法前:表示锁 this
. 举例: 两个线程尝试获取同一把锁🔒
输出结果:
.
当输入一个整数之后,让 线程1 释放锁之后,线程2 才能继续执行: 若两个线程分别加自己的锁(即:不是同一把锁)也就是 让线程1 加锁 locker1,线程2 加锁 locker2 t1 获取到锁之后,t2 仍然再继续执行,即:两个线程之间没有竞争,没有互斥了 (用的两个对象来分别 synchronized)
仍以取钱为例: 锁和对象是一一对应的,每个对象的对象头内部都有一个锁标记,在加锁时,一定要明确当前的代码是在给哪个对象进行加锁,以及需要思考清楚,这样的操作是否能起到互斥的效果 若再将代码修改为(只贴修改了之后的代码):
那么,此时,线程1 和 线程2 会在发生互斥嘛? 会发生互斥,因为getClass 得到的是类对象(类对象只有一个,同一个类只有唯一的类对象),两个线程都在分别针对 locker1 和 locker2 的类对象进行竞争,此处 locker1 和 locker2 类型都是 Object,对应的类对象其实是相同的对象 在一个加锁的代码内部,再次尝试对同一个对象加锁代码示例:
此时由于 locker 对象已经被加锁了,因此第二个对 locker 对象加锁的操作应该会加锁失败(需要第一个锁释放),这个代码看起来是一个死锁 Java 中的加锁 → pthread_mutex_lock函数 Java 中的解锁 → pthread_mutex_unlock函数 上述这种特性的锁 — 可重入锁 总结: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 4:02:58- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |