java面试之线程八锁

所谓的“线程八锁”,其实就是考察 synchronized 锁住的是哪个对象

  • 情况1:12 或 21
  • 情况2:1s后12,或 2 1s后 1
  • 情况3:3 1s 12 或 23 1s 1 或 32 1s 1
  • 情况4:2 1s 后 1
  • 情况5:2 1s 后 1
  • 情况6:1s 后12, 或 2 1s后 1
  • 情况7:2 1s 后 1
  • 情况8:1s 后12, 或 2 1s后 1

情况1:12 或 21

锁的是this对象

@Slf4j(topic = "c.Number")
class Number{public synchronized void a() {log.debug("1");}public synchronized void b() {log.debug("2");}
}
public static void main(String[] args) {Number n1 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n1.b(); }).start();

情况2:1s后12,或 2 1s后 1

情况3:3 1s 12 或 23 1s 1 或 32 1s 1

@Slf4j(topic = "c.Number")
class Number{public synchronized void a() {sleep(1);log.debug("1");}public synchronized void b() {log.debug("2");}
}
public static void main(String[] args) {Number n1 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n1.b(); }).start();
}

情况3:3 1s 12 或 23 1s 1 或 32 1s 1

@Slf4j(topic = "c.Number")
class Number{public synchronized void a() {sleep(1);log.debug("1");}public synchronized void b() {log.debug("2");}public void c() {log.debug("3");}
}
public static void main(String[] args) {Number n1 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n1.b(); }).start();new Thread(()->{ n1.c(); }).start();
}

假如时间片分给1,1需要等待1秒,然后3没有锁,3就执行了,所以1不会在3的前面

情况4:2 1s 后 1

@Slf4j(topic = "c.Number")
class Number{public synchronized void a() {sleep(1);log.debug("1");}public synchronized void b() {log.debug("2");}
}
public static void main(String[] args) {Number n1 = new Number();Number n2 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n2.b(); }).start();

线程1锁的是n1对象,线程2锁的是n2对象,不互斥

情况5:2 1s 后 1

@Slf4j(topic = "c.Number")
class Number{public static synchronized void a() { // 锁的是Number类的类对象sleep(1);log.debug("1");}public synchronized void b() { // 锁的是this对象log.debug("2");}}
public static void main(String[] args) {Number n1 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n1.b(); }).start();
}

情况6:1s 后12, 或 2 1s后 1

@Slf4j(topic = "c.Number")
class Number{public static synchronized void a() {sleep(1);log.debug("1");}public static synchronized void b() {log.debug("2");
}
}
public static void main(String[] args) {Number n1 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n1.b(); }).start();
}

都是对类对象加锁,类对象整个内存里只有一份,所以是互斥的

情况7:2 1s 后 1

@Slf4j(topic = "c.Number")
class Number{public static synchronized void a() { sleep(1);log.debug("1");}public synchronized void b() {log.debug("2");}
}
public static void main(String[] args) {Number n1 = new Number();Number n2 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n2.b(); }).start();
}

线程1锁的是类对象,线程2锁的是this对象,不是互斥的

情况8:1s 后12, 或 2 1s后 1

class Number{public static synchronized void a() {sleep(1);log.debug("1");}public static synchronized void b() {log.debug("2");}
}
public static void main(String[] args) {Number n1 = new Number();Number n2 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n2.b(); }).start();
}

锁的是类对象,是互斥的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/821369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PLC扩展更自由,钡铼IOy系列模块实现DI/DO/AI/AO任意组合

随着工业自动化的不断发展,PLC(可编程逻辑控制器)作为工业控制领域的核心设备,扮演着至关重要的角色。而钡铼IOy系列模块作为PLC的重要扩展设备,不仅实现了DI(数字输入)、DO(数字输出…

nodejs读取并计算指定文件的MD5哈希值

读取并计算指定文件的MD5哈希值 /*** 读取并计算指定文件的MD5哈希值* param {string} file - 文件路径* returns {void} 不返回任何值,但会打印出文件的MD5哈希值*/ const fs require(fs); // 引入文件系统模块 const crypto require(crypto); // 引入加密模块 …

Scala之List

列表 不可变列表(List) 在Scala中,通过List来定义不可变列表,需要注意的是,List本身是一个抽象类,所以并不能直接使用List来构建对象,需要使用它的伴生对象来构建 package com.fesco.listimport scala.::object ListD…

代码随想录训练营第三十五期|第天16|二叉树part03|104.二叉树的最大深度 ● 111.二叉树的最小深度● 222.完全二叉树的节点个数

104. 二叉树的最大深度 - 力扣(LeetCode) 递归,可以前序遍历,也可以后序遍历 前序遍历是backtracking 下面是后序遍历的代码: /*** Definition for a binary tree node.* public class TreeNode {* int val;* …

TOP100 二分法

写在前面:二分法用在有序序列上 1.35. 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示…

Ubuntu20从0开始选择合适版本手动安装cuda,torch-geometric,jax

一个全新的ubuntu20台式机,在Additional Drivers安装nvidia-470-server(一开始安装450,cunda版本只能到11.0,torch有些库用不了,可以直接切换点击Apply Changes重启就行) nvidia-smi查看CUDA Version可到…

全球最新国内外18个热门风景视频素材网站推荐

寻找最新的高清风景视频素材?这里有国内外共18个热门网站,精心整理供您选择。 国内资源: 蛙学网:免费提供多种无版权视频素材,资源丰富。新GG网:需QQ登录,提供丰富的视频模板,通过…

【数据库】MVCC

MVCC是一种用来解决读写冲突的无锁并发控制,也就是为事务分配单项增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照 MVCC,全称Multi-Version Concurrency Control&am…

vue快速入门(十七)v-model数据双向绑定修饰符

注释很详细&#xff0c;直接上代码 上一篇 新增内容 v-model.trim 自动去除首尾空格v-model.number 自动转换成数字类型 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" con…

kubelet的作用

1、节点管理 定时向api server汇报本节点的信息状态&#xff0c;资源使用状态&#xff0c; 2、pod管理 负责维护节点pod的生命周期&#xff0c;创建、更新、删除容器 3、容器健康检查 kubelet会定期调用容器中的探针来检测容器是否存活、就绪&#xff0c;来进行对应的操作…

基于ADB的Scrcpy实现电脑控制手机

Scrcpy是一个开源的&#xff0c;基于ADB&#xff08;Android 调试桥&#xff09;的手机到电脑上的投屏操控的实现&#xff0c;本文将介绍如何搭建开发环境&#xff0c;使得在Windows系统中去控制投屏的安卓手机。 1. 安装投屏软件 下载Scrcpy软件到电脑上&#xff0c;该软件中…

贪心算法--购买股票

给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得的 最大 利润 。 示例 1&a…

YoloV9实战:从Labelme到训练、验证、测试、模块解析

模型实战 训练COCO数据集 本次使用2017版本的COCO数据集作为例子&#xff0c;演示如何使用YoloV8训练和预测。 下载数据集 Images: 2017 Train images [118K/18GB] &#xff1a;http://images.cocodataset.org/zips/train2017.zip2017 Val images [5K/1GB]&#xff1a;htt…

【电控笔记2.2】电流回路+延迟效应

延迟效应的来源以及影响 数字控制系统的delay: 5.4节有介绍T0=0.5TS 低通滤波器的时间常数? 滤波器的传递函数与性能参数

【多线程】阻塞队列 | put()方法 | take()方法 | 生产者-消费者模式 |实现阻塞队列

文章目录 阻塞队列1.生产者-消费者模式生产者消费者模型的意义&#xff1a;1.解耦合2.削峰填谷&#xff1a; 2.阻塞队列的使用BlockingQueue 3.实现阻塞队列唤醒&#xff1a;使用阻塞队列实现生产者消费者模型 阻塞队列 阻塞队列是一种特殊的队列&#xff1a; 1.是线程安全的。…

Vue 阶段练习:记事本

将 Vue快速入门 和 Vue 指令的学习成果应用到实际场景中&#xff08;如该练习 记事本&#xff09;&#xff0c;我们能够解决实际问题并提升对 Vue 的技能掌握。 目录 功能展示 需求分析 我的代码 案例代码 知识点总结 功能展示 需求分析 列表渲染删除功能添加功能底部统计…

网络—DAY4

思维导图 多进程并发服务器 #include<myhead.h> #define SER_IP "192.168.122.56" #define SER_PORT 8888 void handler(int signo) {if(signoSIGCHLD){while(waitpid(-1,NULL,WNOHANG)>0);} } int main(int argc, char *argv[]) {//将SIGCHLD信号与处理…

项目中,如何写 readme.md 文件 | 写项目总结

tips&#xff1a;注意写 1. readme文件&#xff1a;①项目文档&#xff08;项目需求和设计文档、项目系统架构和技术文档、接口文档&#xff09;、②项目结构、③启动项目。具体结构见下文。 2. 项目总结&#xff1a;技术栈、描述、主要工作&#xff01;&#xff01;需求及功…

MySQL常见故障现象分析及解决办法

一、背景 MySQL作为广泛使用的关系型数据库管理系统&#xff0c;在日常使用中难免会遇到各种故障。本文将通过一个具体的案例&#xff0c;分析MySQL常见的故障现象&#xff0c;并提供相应的解决办法和代码示例。 二、故障现象 某企业使用的MySQL数据库服务器近期出现以下问题…

FastAPI 是干啥的

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;与 Python 3.6 类型提示一起使用。它基于标准 Python 类型提示&#xff0c;使用 Python 3.6 的类型注解来声明请求参数和返回值的类型&#xff0c;这使得代码既简洁又易…