Android面试一天一题(16 Day: 线程同步)

最近领导让我在插件框架上加上一个接口,在宿主应用中可以调用所有的插件去清除自己的缓存数据,当完成所有插件的清除任务后再执行下一步操作。领导就是需求嘛,领导改变注意那是再正常不过的事了,但是不是领导的需求人员有可能变多了会有人身危险。我平时和同事吹牛时,常和他们说工作的七字真言:

“不急、不怕、不要脸”(抄自冯唐)

我认为对于软件开发来说,这句话很值得品味。在需求改变时,不要急于修改代码,而是要先做一个全盘的考虑,有些时候你还没考虑好,需求方就说不要做了。在接到新任务或者遇到困难时不要怕,没什么可怕的,你不难受你就不会有提高。最后,不要脸更是程序员最需要的,这个自己体会。

面试题:如何处理线程同步的问题?

有可能很多人对插件并不了解,不过没关系,这个需求简单地说就是主线程要等待多个子线程全部完成工作后,才能继续执行。

说到多线程的同步问题,面试多的人应该很容易被面试官问:Object的wait和notify/notifyAll如何实现线程同步?

在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。

wait和yield(或sleep)的区别?

  1. wait()是让线程由“运行状态”进入到“等待(阻塞)状态”,而yield()是让线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权。
  1. wait()是会线程释放它所持有对象的同步锁,而yield()方法不会释放锁。

而我接触到的很多情况是:问线程同步的问题,大多数人基本上只知道synchronized。

要搞清线程的同步问题,大家要先了解一下“对象的同步锁”,这个留给大家自己去看吧,这里不做展开。我们回到新接到的这个需求上来,这个场景其实挺合适做为一个面试题的。

如何实现呢?我想到一个简单的方法就是用CountDownLatch。

CountDownLatch:一个同步辅助类(大名鼎鼎的java.util.concurrent包),在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

用给定的任务数初始化CountDownLatch,一个线程工作完成(任务成功或者失败都算工作完成)就调用 countDown() 方法,当计数到达零之前,await 方法会一直受阻塞。当计数器为零时,会释放所有等待的线程,await后的代码将被执行。

CountDownLatch计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。

还有其他的实现方式吗?这个是肯定的。比如,真接上Thread.jion,代码难看是会难看点,但也能完成这个需求。

我还查到一种方式是使用java.util.concurrent.ExecutorService的awaitTermination阻塞主线程,等待线程池的所有线程执行完成。需要设置一个超时时间的参数,如果超时则awaitTermination返回false,如果线程池中的线程全部执行完成,返回true。

小结

因为现在有很多开源的框架或者代码库,帮我们解决了很多底层诸如网络请求、线程池管理的问题,使得很多情况下我们都不怎么接触到线程同步的问题。不过还有很有必要抽时间来学习一些线程同步的知识,对我们提高并发编程的能力很有帮助。

如果大家有更好的方式实现我开头提到的需求,可以回帖一起讨论一下。

Even 原创
简书链接:http://www.jianshu.com/users/f9fbc7a39b36/latest_articles
转载请注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • 下面是我自己收集整理的Java线程相关的面试题,可以用它来好好准备面试。 参考文档:-《Java核心技术 卷一》-...
    阿呆变Geek阅读 14,788评论 14 507
  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 2,085评论 0 14
  • 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让...
    尧淳阅读 1,590评论 0 25
  • 真是喜欢这段话 Leave egotism and personaj agendas at the door. T...
    柳涛虹阅读 228评论 0 3
  • 歌曲《从前慢》中有句歌词 从前的月色变得慢 车 马 邮件都慢 一生只够 爱一个人 。。。 多美的台词,令我心旌摇曳...
    一水轻尘阅读 387评论 0 1