所谓的“线程八锁”

其实就是看 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. shell分析nginx日志的一些指令

    前言 nginx日志格式默认 shell指令 查看有多少个IP访问: awk '{print $1}' log_file|sort|uniq|wc -l 查看某一个页面被访问的次数: grep &qu ...

  2. Jmeter插件PerfMon Metrics Collector安装使用及报错解决

    Jmeter作为一个轻量级的性能测试工具,开源.小巧.灵活的特性使其越来越受到测试人员喜爱.在实际的 项目中,特别是跨地区项目,排除合作方指定要求使用Loadrunner作为性能测试工具外,Jmete ...

  3. HarmonyOS扫码服务,应用服务一扫直达打造系统级流量新入口

    二维码如今是移动应用流量入口以及功能实现的重要工具,也是各App的流量入口,是物.人.服务的连接器,通过扫码我们可以更便捷的生活,更高效的进行信息交互,包括信息的发布.信息的获取. 在日常扫码过程中, ...

  4. CCF 202012-5星际旅行(20~100分)

    前置知识 线段树:通过懒惰标记,可实现区间处理,和区间询问皆为\(O(logn)\)时间复杂度的数据结构,是一种二叉树.因此对于一个节点\(st\),其左儿子节点为\(st*2\),右节点为\(st* ...

  5. Nomad 系列-Nomad 挂载存储卷

    系列文章 Nomad 系列文章 概述 显然,如果 Nomad 要运行有状态存储,那么挂载存储卷就是必备功能. Nomad 允许用户通过多种方式将持久数据从本地或远程存储卷装载到任务环境中: 容器存储接 ...

  6. Linux——Linux必备的基础知识总结

    文章目录 一.Linux操作系统概述 1.发展 2.组成 3.Linux的特性: 二.Linux操作系统安装 1.Linux的选择 2.安装Ubuntu Desktop 3.基本操作 三.Linux文 ...

  7. Vue2系列(lqz)——Vue生命期钩子、组件

    文章目录 Vue声明期钩子 组件 1 fetch和axios 1.1 fetche使用 1.2 axios的使用 2 计算属性 2.1 通过计算属性实现名字首字母大写 2.2 通过计算属性重写过滤案例 ...

  8. C#学习笔记--变量类型的转换

    变量类型的转化: 转换原则 同类型的大的可以装小的,小类型的装大的就需要强制转换. 隐式转换: 同种类型的转换: //有符号 long-->int-->short-->sbyte l ...

  9. node(1)

    1.新建http.js //node搭建http服务器 let http=require('http'); //使用http建立服务请求 http.createServer(function(requ ...

  10. 配置nginx访问控制-设置防盗链

    1.设置访问控制.只允许本机查看nginx的status状态信息,其它人均拒绝: nginx -V查看nginx是否有status模块,如果没有需要添加 编辑修改nginx.conf文件:在serve ...