线程八锁
2023-09-11 14:16:49 时间
所谓的“线程八锁”,其实就是考察 synchronized 锁住的是哪个对象
情况1:12 或 21
锁住的为同一对象,2个线程都有可能执行
@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
锁住的为同一对象,2个线程都有可能执行
@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
锁住的为同一对象,3个线程都有可能执行
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();
}
情况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();
}
情况5: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();
new Thread(()->{ n1.a(); }).start();
new Thread(()->{ n1.b(); }).start();
}
情况6:1s 后12, 或 2 1s后 1
锁住的为同一对象,2个线程都有可能执行
@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();
}
情况8:1s 后12, 或 2 1s后 1
锁住的为同一对象,2个线程都有可能执行
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();
}
相关文章
- 线程管理(八)在线程里处理不受控制的异常
- Java线程池架构(二)多线程调度器
- Linux将线程绑定到CPU内核运行
- day02-多线程之线程安全
- 线程调度小示例:newSingleThreadScheduledExecutor用法
- java线程分析方法
- 线程池Executors创建多线程案例
- paip.java 线程无限wait的解决
- SimpleDateFormat线程不安全了?这里有5种解决方案
- Java中的线程到底有哪些安全策略
- C++11 实现的 100行 线程池
- 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java线程学习笔记(两) 线程异常处理
- c# 变量,对象,静态类型,集合类的线程安全回顾
- Java开发之——线程面试篇:死锁和如何避免死锁?
- 自定义线程池