首页 > 编程语言 >Java并发(十六)----线程八锁

Java并发(十六)----线程八锁

时间:2023-12-02 12:00:41浏览次数:36  
标签:八锁 Java synchronized void Number ---- n1 new public

所谓的“线程八锁”

其实就是看 synchronized 锁住的是哪个对象

情况1:12 或 21都是有可能的,就看cpu先调度哪个线程

@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 ,还是看cpu先调度哪个线程

@Slf4j(topic = "c.Number")
class Number{
    public synchronized void a() {
        sleep(1); //睡眠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,3肯定是最开始的打印的,就看1或2谁先打印

@Slf4j(topic = "c.Number")
class Number{
    public synchronized void a() {
        sleep(1);//睡眠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();
}

情况4:2 1s 后 1,没有互斥,同时运行,2先打印,sleep 1秒后打印1

@Slf4j(topic = "c.Number")
class Number{
    public synchronized void a() {
        sleep(1);//睡眠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();
}

情况5:2 1s 后 1,锁住的对象不同,所以和题4一样,不存在互斥。

@Slf4j(topic = "c.Number")
class Number{
    public static synchronized void a() {
        sleep(1);//睡眠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();
}

情况6:1s 后12, 或 2 1s后 1,还是看cpu先调度哪个线程

@Slf4j(topic = "c.Number")
class Number{
    public static synchronized void a() {
        sleep(1);//睡眠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,锁住的对象不同,所以和题4一样,不存在互斥。

@Slf4j(topic = "c.Number")
class Number{
    public static synchronized void a() {
        sleep(1);//睡眠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();
}

情况8:1s 后12, 或 2 1s后 1,锁着的同一个对象,还是看cpu先调度哪个线程

@Slf4j(topic = "c.Number")
class Number{
    public static synchronized void a() {
        sleep(1);//睡眠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();
}

 

标签:八锁,Java,synchronized,void,Number,----,n1,new,public
From: https://www.cnblogs.com/xiaoyh/p/17156338.html

相关文章

  • 使用极限网关助力 ES 集群无缝升级、迁移上/下云
    在工作中大家可能会遇到以下这些场景:自建ES集群需要平滑迁移到XX云;从XX云将ES集群迁移到自建机房;ES集群进行跨版本升级,同时保留回退能力;这些场景往往都还有个共同的需求:迁移过程要保证业务的最小停机时间。幸运的是,在这三个场景中,我们都能使用极限网关来帮助我们......
  • 基于Aidlux平台的工业视觉少样本缺陷检测
    工业视觉缺陷检测的工作流程 常用异常检测算法面临的挑战及发展图像分割的数据标注 数据标注准确的重要性:训练模型的基础提高模型性能降低误判和误诊分险减少资源浪费自动标注SAM   模型切换模型部署#-*-coding:UTF-8-*-importaidlite_gpu......
  • 结每天吃什么?
    随机一个吧packagecom.hwd.campus.trade.biz.controller;importjavafx.application.Application;importjavafx.geometry.Pos;importjavafx.scene.Scene;importjavafx.scene.control.Button;importjavafx.scene.control.Label;importjavafx.scene.layout.BorderPane......
  • OpenCASCADE-HLR Edge
    OpenCASCADE-HLREdge1Introduction用计算机生成三维物体的真实图形,是计算机图形学研究的重要内容。真实图形在仿真模拟、几何造型、广告影视和科学计算可视化等许多领域都有着广泛应用。在用显示设备描述物体的图形时,必须把三维信息经过某种投影变换在二维的显示平面上绘制出......
  • 进制转换与位运算
    进制12个物品被称为1打,12打被称为1罗,12罗被称为1格。请问:15个是几打几个?6775个是几格几罗几打?2打3个是多少个?1格9罗8打10个是多少个?以上的“几”均是不小于0且小于12的整数分析根据15÷12=1···3,15个除以每打是几个,就是几打,剩下的就是几......
  • Linux 下使用命令将图片反色
    #单张图片反色convert-negateimage.pngimage_ne.png#单张图片反色(替换)convert-negateimage.pngimage.png#单张图片反色,修复格式不兼容convertimage.pngimage.png&&convert-negateimage.pngimage_ne.png#单张图片反色,修复格式不兼容(替换)convertimage.p......
  • SpringSecurity鉴权简介
    前言本博文为听课笔记,简单记录下SpringSecurity的鉴权方式及如何在整个流程中自定义个性化鉴权,以备后续学习及工程需要。正文一个请求进来SpringSecurity会经过一系列的过滤器,示意图如下:jwtFilter简介:验证用户token,通过则将其保存在SpringSecurity的上下文,保持登录状态F......
  • css选择器
    这篇文章主要总结了css选择器的相关知识1.元素选择器<divid="container"><pclass="text"></p><h1class="titletext"></h1><div>//选中p元素p{font-size:12px;}2.群组选择器//html同上,同时选中p和h1元素p,h1{c......
  • 原码、反码、补码再探
    原码、反码、补码再探概述三个计算机用来表达负数的形式。原码通过第一位的\(0\)来直接表示正数,\(1\)来直接表示负数。然而计算机并不用这种方式。反码即把要表示的负数的绝对值对应的二进制全部取反来表示。坏处是\(0\)有两种表达方式,全\(0\)和全\(1\),所以......
  • HPM5300 GPIO控制代码
    #include"HPM5300.h"voidGPIO_Init(void){//初始化GPIO引脚为输出模式HPM5300_GPIO_SetMode(GPIOA,GPIO_MODE_OUTPUT);HPM5300_GPIO_SetMode(GPIOB,GPIO_MODE_OUTPUT);//设置GPIO引脚的初始状态HPM5300_GPIO_Write(GPIOA,GPIO_VALUE_LOW);......