专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
程序员的那些事  ·  北京大学出的第二份 DeepSeek ... ·  23 小时前  
码农翻身  ·  漫画 | 为什么大家都愿意进入外企? ·  2 天前  
程序猿  ·  41岁DeepMind天才科学家去世:长期受 ... ·  2 天前  
程序员的那些事  ·  清华大学:DeepSeek + ... ·  3 天前  
程序员小灰  ·  DeepSeek做AI代写,彻底爆了! ·  6 天前  
51好读  ›  专栏  ›  SegmentFault思否

史上最难的一道 Java 面试题 (分析篇)

SegmentFault思否  · 公众号  · 程序员  · 2017-10-23 08:00

正文

文章作者:匠心零度 http://my.csdn.net/lirenzuo 原文链接: http://blog.csdn.net/lirenzuo/article/details/78253481

无意中了解到如下题目,觉得蛮好。

题目如下:

  1. public class TestSync2 implements Runnable {

  2.    int b = 100;          

  3.    synchronized void m1() throws InterruptedException {

  4.        b = 1000;

  5.        Thread.sleep(500); //6

  6.        System.out.println("b=" + b);

  7.    }

  8.    synchronized void m2() throws InterruptedException {

  9.        Thread.sleep(250); //5

  10.        b = 2000;

  11.    }

  12.    public static void main(String[] args) throws InterruptedException {

  13.        TestSync2 tt = new TestSync2();

  14.        Thread t = new Thread(tt);  //1

  15.        t.start(); //2

  16.        tt.m2(); //3

  17.        System.out.println("main thread b=" + tt.b); //4

  18.    }

  19.    @Override

  20.    public void run() {

  21.        try {

  22.            m1();

  23.        } catch (InterruptedException e) {

  24.            e.printStackTrace();

  25.        }

  26.    }

  27. }

该程序的输出结果?

程序输出结果:

  1. main thread b=2000

  2. b=1000

  3. main thread b=1000

  4. b=1000

考察知识点

  • synchronize实例锁。

  • 并发下的内存可见性。

在java中,多线程的程序最难理解、调试,很多时候执行结果并不像我们想象的那样执行。所以在java多线程特别难,依稀记得大学的时候考c语言二级的时候,里面的题目是什么++和很多其他优先级的符合在一起问最后的输出结果,这类题目就想考一些运行符优先级和结合性问题。那个背背就行了,但是java多线程还是需要好好理解才行,靠背是不行的。

下面开始简单分析

该题目涉及到2个线程(主线程main、子线程)、关键词涉及到synchronized、Thread.sleep。 synchronized关键词还是比较复杂的(可能有时候没有理解到位所以上面题目会有点误区),他的作用就是实现线程的同步(实现线程同步有很多方法,它只是一种后续文章会说其他的,需要好好研究大神Doug Lea的一些实现),它的工作就是对需要同步的代码加锁,使得每一次只有一个线程可以进入同步块(其实是一种悲观策略)从而保证线程只记得安全性。

一般关键词synchronized的用法







请到「今天看啥」查看全文