`

由迅雷笔试题想到的——Guarded Suspension Pattern设计模式

阅读更多

有个网友,发了个帖子其中说到了迅雷的笔试题。帖子地址如下:

http://topic.csdn.net/u/20091129/21/4bbf398d-431a-4f8e-accc-b8de6572b8af.html

其中有道关于多线程的题目,觉得挺好玩,拿来分析一下:

有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC…

题目分析:

三个线程,交替打印ABC,10次。所以可能的考点是

A.三个线程顺序执行。

B.10次说明至少有一个计数器,初步假设可能为每个线程都有一个计数器(个人认为这样子不可取)。另外一种假设是有公共区域,即关键区,题目意在考对关键区的读写操作。

粗略的看一下,感觉和Guarded Suspension Pattern设计模式很像。

【补充】举例介绍一下Guarded Suspension Pattern模式。

【例子】你在家里换衣服,忽然门铃响了,原来是邮递员送信来了。可是你衣服换到一半,不能开门,所以就说“请等我一下,我马上来。”,邮递员不敢闯入,只能等待在外。当你换号衣服,再打开门,说句“不好意思,久等了。。。”,顺利取到邮件。

guarded的意思是“被保护着,被防备着”,suspension的意思是“暂停”的意思。当现在不适合马上执行某个操作时,就要求执行该操作的线程等候,以保证实例的安全性(在例子中就如同你的隐私权一样)。这就是Guarded Suspension Pattern的核心思想。

这种设计模式还有其他的一些名称,如 "guardard wait"或"spin wait"等。

对于本题,我设定了三个类。

PrintThread

ID非别为A、B、C的三个线程就是他了。通过构造函数传入的name的不同,区分不同的线程。

RequestQueue

三个线程请求的公共区域。RequestQueue会储存三个线程要打印的信息和打印次数。通过对printMsg方法的同步限制,从而使三个并发线程安全,正确的访问关键区,即RequestQueue对象。

TestABC

Main函数所在的类,用来新建一个RequestQueue和三个线程类。

以上代码,运行过,可以按题目打印。但是可能仍有未发现的问题隐患,欢迎大家拍砖,交流。

分享到:
评论

相关推荐

    java多线程设计模式详解(PDF及源码)

    第1章 Single Threaded Execution——能通过这座桥的,只有一个人 第2章 Immutable——想破坏它也没办法 第3章 Guarded Suspension——要等到我准备好喔 第4章 Balking——不需要的话,就算了吧 第5章 Producer-...

    java多线程设计模式 (PDF中文版, 附源码)

    第3章 Guarded Suspension——要等到我准备好喔 第4章 Balking——不需要的话,就算了吧 第5章 Producer-Consumer——我来做,你来用 第6章 Read-Write Lock——大家想看就看吧,不过看的时候不能写喔 第7章 read-...

    Java多线程详解

    3、Guarded Suspension ———— 要等到我们准本好哦 4、Balking ———— 不需要的话,就算了吧 5、Producer-Consumer ———— 我来做,你来用 6、Read-Write Lock ———— 大家想看就看吧,不过看的时候不能写哦...

    设计模式笔记

    - **Guarded Suspension(受保护的暂停模式)**:当一个线程调用另一个线程的同步方法时,如果该同步方法没有准备好,则该线程将阻塞,直到该同步方法准备好为止。 - **Producer Consumer(生产者消费者模式)**:...

    aqs-并发编程笔记.pdf

    并发编程笔记中的知识点涵盖了保护性暂停模式(Guarded Suspension Design Pattern)的定义、实现与分析,以及在Java中如何通过GuardedObject对象来实现多线程间的结果传递和超时处理。以下是详细的知识点梳理: 1....

    Java高并发编程详解:多线程与架构设计 (Java核心技术系列)

    如监控任务的生命周期管理、单线程执行模式、读写锁分离、不可变对象设计,以及`Future`和`Guarded Suspension`模式,这些模式在解决实际并发问题时有着广泛的应用。 书中的每一章都包含丰富的实例和详尽的解释,...

    laravel中的fillable和guarded属性详解

    在创建和更新模型时,`fillable` 和 `guarded` 属性是两个非常重要的概念,它们控制着如何通过 `create` 和 `update` 方法批量赋值模型属性。 首先,我们来看 `fillable` 属性。`fillable` 被称为白名单,它定义了...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段24讲、Guarded Suspension设计模式-上.mp4 │ 高并发编程第二阶段25讲、Guarded Suspension设计模式-下.mp4 │ 高并发编程第二阶段26讲、ThreadLocal使用详解,深入原理介绍.mp4 │ 高并发...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段24讲、Guarded Suspension设计模式-上.mp4 │ 高并发编程第二阶段25讲、Guarded Suspension设计模式-下.mp4 │ 高并发编程第二阶段26讲、ThreadLocal使用详解,深入原理介绍.mp4 │ 高并发...

    20.9.24aqs-并发编程笔记.pdf

    保护性暂停模式(Guarded Suspension Design Pattern)是一种在多线程环境下实现线程之间安全地传递信息的模式。这种模式主要解决了在并发编程中如何安全高效地进行线程间通信和数据传递的问题。 该模式的基本概念...

    java并发编程经典书籍(英文版)

    - **并发模式**:介绍了如Producer-Consumer、Builder、Guarded Suspension等经典并发模式,并提供了Java实现。 - **并发集合**:详述了JUC(Java Util Concurrency)库,包括ArrayList、LinkedList、HashMap等...

    aqs-并发编程(2)笔记.pdf

    在并发编程中,保护性暂停模式(Guarded Suspension Design Pattern)是一种常用的同步机制,用于线程间的协作。该模式允许一个线程等待另一个线程的特定操作完成,然后继续执行。在该模式中,线程间共享的某个对象...

    java线程安全总结.pdf

    8. **Guarded Suspension 模式**:这是一种设计模式,通常使用`wait()`和`notify()`方法来协调线程间的执行顺序,确保特定条件满足时线程才能继续执行。 9. **Double-Check Locking(双重检查锁定)**:这是一种...

    guarded-array:边界检查数组

    var guard = require ( 'guarded-array' ) //First create any old array var array = [ 0 , 1 , 2 , 3 , 4 , 5 ] //Then we protect it using guard! var guardedArray = guard ( array ) //The guarded array ...

    逻辑编程语言:GHC (Guarded Horn Clauses).zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 ...

    高性能java系统实现与调优

    - **Guarded Suspension**:在没有足够的资源时暂停执行,避免资源浪费。 - **不变模式**:通过不可变对象减少锁的竞争。 - **生产者-消费者**:通过共享缓冲区协调多个线程的工作。 - **JDK并发框架与优化**: ...

    guarded-string:防止在应用程序中意外地在字符串中引入XSSKong

    yarn add guarded-string 用法 重要的! 应该将其用于防止XSS攻击之类的东西,而不是用于隐藏敏感信息。 import guardedString from 'guarded-string' ; const myString = guardedString `My very important (but ...

Global site tag (gtag.js) - Google Analytics