「小马哥每日一问」2019.07.11 期

mercyblitz · 7月11日

问题描述

public class Bleep {
    String name = "Bleep";

    void setName(String name) {
        this.name = name;
    }

    void backgroundSetName() throws InterruptedException {
        Thread t = new Thread() {
            @Override
            public void run() {
                setName("Blat");
            }
        };
        t.start();
        t.join();
        System.out.println(name);
    }

    public static void main(String[] args) throws InterruptedException {
        new Bleep().backgroundSetName();
    }
}

以上程序输出内容是?

(a) Bleep
(b) Blat
(c) 程序编译错误
(d) 以上都不是

注:每期的「小马哥每日一问」将累计在直播中解答
26 条评论
DHC_ · 7月11日

(a) Bleep 线程之间变量不可见

回复

0

是因为线程调用的是Thread的setName方法

莫名จุ๊บ · 7月11日
踏歌行 · 7月11日

选择 a Bleep setName调用的是public final synchronized void setName(String name)这个方法

回复

0

public final synchronized void setName(String name)这个方法在哪?不是调用线程自己的setName吗

kevin · 7月11日
0

@kevin
在Thread类里面,题目中的setName其实是修改了线程的名字,将线程的名字改为Blat

踏歌行 · 7月11日
0

@踏歌行 我看了下是没有synchronized 关键字的

kevin · 7月11日
肥猪要瘦腿 · 7月11日

回答:d
可见性问题, 主线程可能看不到 t 线程的对 name 的修改。
如果 name 被 volatile 修饰的话, 则输出 Blat.

回复

0

加了volatile运行结果还是Bleep

Mandexv · 7月15日
0
整人君子 · 8月10日
indigozhang · 7月11日

B,

回复

lianp888 · 7月11日

a run方法中调用的setName实际上是执行的Thread本身的setName方法

回复

sansyou · 7月11日

setName("Blat"); 改变了name 的值。加了jion 。所以输出是Blat

回复

张振 · 7月11日

setName("Blat")是将线程t的名称更改为Blat,不是调用Bleep 的setName方法。选a

回复

Dovelol · 7月11日

每天被坑一次,真爽啊,这个不运行就知道调哪个方法的同学真的牛逼。
Bleep.this.setName("Blat"); 如果前面加这个,就是选b了,否则选a。

回复

老虎 · 7月11日

void java.lang.Thread.setName(String name)
啥也不说了。。小马哥变坏了,。
欺负我们不够细心,挖坑给我们跳

回复

0

一般都不用这方法,哈哈哈

继往开来 · 7月11日
小孤枫 · 7月11日

智商被小马哥把玩了一次。。。

回复

继往开来 · 7月11日

套路,几乎没用过thread类里的setName方法🐸

回复

周雁杰 · 7月11日

烟雾弹, 被耍了, 这个 setName

回复

joace4 · 7月11日

= =还以为马哥考的 join的知识点,选择了b。没想到不是

回复

buhuiyoudeniao · 7月11日

被戏耍了啊

回复

载入中...