栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【面试:并发篇12:多线程:线程八锁】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【面试:并发篇12:多线程:线程八锁】

【面试:并发篇12:多线程:线程八锁】 00.前言

如果有任何问题请指出,感谢。

01.介绍

线程八锁 其实就是考察 synchronized 锁住的是哪个对象

02.例子 情况一:
@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();
}

结果

12或21

这个很好理解 两个锁的监听器都是 Number的对象n1,不过结果为什么有21 因为虽然可能性很小 但依然有可能先运行b线程

情况二:
@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();
}

结果

1s后 12,或者,2 1s后 1

解释

如果a b线程的监听器都是 n1对象,所以如果a线程执行 那么就会是先等1s 再12,如果是b线程先执行 就会是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 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();
}

结果

3 2 1s后 1,或,3 1s后 1 2,或者 2 3 1s后 1

解释

因为c线程没有加锁,ab线程加锁且监听器都是n1,又因为 线程a等待1s,所以 要么b线程先执行要么c先执行,所以答案就是上述结果

情况四:
@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();
}

结果

2 1s后 1

解释

因为a线程的监听器是n1 b线程的监听器是n2 所有这两个线程达不到同步的目的,所以结果是 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();
}

结果

2 1s后 1

解释

因为a线程锁定的方法是类方法 所有a线程的监听器是类,而b线程的监听器是n1对象,故二者没有同步,所以结果是 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();
}

结果

1s 后12,或,2 1s后 1

解释

因为a b 线程 锁定的方法都是Number类方法 所以他们的监听器一样,所以结果为 1s 后12,或,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();
}

结果

2 1s 后 1

解释

因为a线程锁定的方法是类方法 所有a线程的监听器是类,而b线程的监听器是n2对象,故二者没有同步,所以结果是 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();
 Number n2 = new Number();
 new Thread(()->{ n1.a(); }).start();
 new Thread(()->{ n2.b(); }).start();
}

结果

1s 后12,或,2 1s后 1

解释

因为a b 线程 锁定的方法都是Number类方法 所以他们的监听器一样,所以结果为 1s 后12,或,2 1s后 1

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1014289.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号