所谓的“线程八锁”,其实就是考察 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();
}
锁的是类对象,是互斥的