所谓的“线程八锁”

其实就是看 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并发(十六)----线程八锁的更多相关文章

  1. Java并发编程 (六) 线程安全策略

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.不可变对象-1 有一种安全的发布对象,即不可变对象. 1.不可变对象需要满足的条件 ① 对象创建以后 ...

  2. Java并发编程:线程和锁的使用与解析

    线程的使用  新建线程 新建一个线程有两种方法:继承Thread类,然后重写run方法:实现Runnable接口,然后实现run方法.实际上Thread类也是实现的Runnable接口,再加上类只能单 ...

  3. Java多线程——线程八锁案例分析

    Java多线程——线程八锁案例分析 摘要:本文主要学习了多线程并发中的一些案例. 部分内容来自以下博客: https://blog.csdn.net/dyt443733328/article/deta ...

  4. java多线程 -- 线程八锁

    一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一一个线程去访问这些 ...

  5. Java并发编程:线程控制

    在上一篇文章中(Java并发编程:线程的基本状态)我们介绍了线程状态的 5 种基本状态以及线程的声明周期.这篇文章将深入讲解Java如何对线程进行状态控制,比如:如何将一个线程从一个状态转到另一个状态 ...

  6. Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

  7. 读-写锁 ReadWriteLock & 线程八锁

    读-写锁 ReadWriteLock: ①ReadWriteLock 维护了一对相关的锁,一个用于只读操作, 另一个用于写入操作. 只要没有 writer,读取锁可以由 多个 reader 线程同时保 ...

  8. Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  9. Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  10. Java并发编程:线程池的使用(转)

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

随机推荐

  1. GitHub Deskhub使用

    (适合已经知道git是啥但是还不太熟到同学看-) GitHub deskhub就是一个图形化的github管理工具啦,比起来命令行使用舒服100倍哈哈哈- 链接:https://desktop.git ...

  2. 11、Mybatis之逆向工程

    11.1.正向与逆向工程概述 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表:例如Hibernate是支持正向工程的. 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成Ja ...

  3. 10、Mybatis之缓存

    10.1.环境搭建 10.1.1.创建新module 创建名为mybatis_cache的新module,过程参考5.1节 10.1.2.创建Mapper接口和映射文件 package org.rai ...

  4. ATtiny88初体验(三):串口

    ATtiny88初体验(三):串口 ATtiny88单片机不包含串口模块,因此只能使用软件方式模拟串口时序. 串口通信时序通常由起始位.数据位.校验位和停止位四个部分组成,常见的配置为1位起始位.8位 ...

  5. 「coci 2021-2022 #1」Logičari

    link. 断环后把断的边所连的两个点特殊标记,作为两个特殊点.这样就是一个树,树的做法很简单吧,把两个特殊点特殊处理带进状态即可. 具体一点就是,设 \(f(x,c_x,c_f,c_{rt_1},c ...

  6. ChatGPT多个APIkey如何自主切换

    chatgpt目前账户大多数为18美金,那么用户在调用api时候出现金额不足要手动更换chatgpt 当前方法为了解决多账户自主切换api使用. 创建一个名为$arr的数组,它包含几个key.我们使用 ...

  7. ElasticSearch系列——倒排索引、删除映射类型、打分机制、配置文件、常见错误

    文章目录 1 倒排索引 2 删除映射类型 一 前言 二 什么是映射类型? 三 为什么要删除映射类型? 四 映射类型的替代方法 4.1 将映射类型分开存储在索引中 4.2 自定义类型字段回到顶部 五 没 ...

  8. Redis系列之——Redis-Sentinel

    文章目录 一 主从复制高可用 二 架构说明 三 安装配置 四 客户端连接 一 主从复制高可用 #主从复制存在的问题: #1 主从复制,主节点发生故障,需要做故障转移,可以手动转移:让其中一个slave ...

  9. oracle数据库性能监控常用sql

    因执行时间较长建议使用plsql等第三方工具执行 --1.监控sga内存分配信息select * from v$sgainfo;--2.监控每个用户的磁盘io及io命中率select v$sess_i ...

  10. 环境搭建:在VSCode搭建Python环境

      1.安装vscode     2.下载python解释器 安装python https://www.python.org/downloads/windows/ 下载可执行的安装文件:   安装完成 ...