1. 程式人生 > 其它 >編譯原理實驗三【中間程式碼生成程式設計】

編譯原理實驗三【中間程式碼生成程式設計】

技術標籤:多執行緒javakafkatypescriptleetcode

所謂的“執行緒八鎖”,其實就是考察 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();
}