- 浏览: 130593 次
- 性别:
- 来自: ...
文章分类
最新评论
保持对知识点或者技术的熟悉度对于程序员至关重要,要学会一个技术点可能不需要很多精力或者时间,但是要精通或者长时间保持对其的熟悉程度往往非常困难。个人的观点是通过演练对自己掌握的知识点保鲜是一个很好的途径。这其中包括了写Blog阐述,对周围的爱好者演讲,与其他程序员交流辩论以及最重要的多找机会去写相关的程序或者解决相关的问题,难点来加深理解和延长熟悉度。所以我通过写Blog和找相关的问题解决来试图延长对某个知识点的熟知度,毕竟长时间不用,不理会的东西不管什么都会自然的被遗忘。多线程相关的编程对于Web应用开发过程中使用的机会很少,所以只有自己找一些题目或者问题演练。
之前看到过这样的一个题目:三个线程,线程名分别为A、B、C,设计程序使得三个线程循环打印“ABC”10次后终止。这个题目相对于我之前写的那个疑似Google面试题来说要简单的多。可以看成是三个线程写一个文件的简化版本,不需要考虑调整优先级。主要思路一致:记录最后一次写入的位置。具体的代码示例如下:
这里用于记录以操作总数的counter利用了volatile的可见性的特性。多个子线程可以同时得到最新的counter的值,又由于对counter的递增与改变latestPos值的操作是一个共同的原子操作,所以可以使用lock来确保counter++的线程安全。故基于上述的原因使用volatile关键字。另外一点是在print方法里也使用counter <= size检查条件的原因是:当counter=29,一个线程执行counter++之前,其余的线程中的一个或者多个counter <= size条件依然满足,故都进入竞争等待阶段,所以一旦进入lock块就意味着counter实际已经30了,不应该再继续打印,故print()方法内依然有此条件检查。
这个例子虽然相对简单,但是也是一样考察了线程调度的问题。暂时没有无锁实现的清晰的思路,所以只是使用另一种线程同步的机制ReentrantLock演练一下。最近开始找工作,不知笔试或者面试中能不能激发多一点的多线程方面的灵感和领悟,呵呵。找工作虽然比较难,但是希望自己能在这个陌生的城市坚持并如愿...
之前看到过这样的一个题目:三个线程,线程名分别为A、B、C,设计程序使得三个线程循环打印“ABC”10次后终止。这个题目相对于我之前写的那个疑似Google面试题来说要简单的多。可以看成是三个线程写一个文件的简化版本,不需要考虑调整优先级。主要思路一致:记录最后一次写入的位置。具体的代码示例如下:
import java.util.concurrent.locks.ReentrantLock; /** * @author: yanxuxin * @date: 2010-2-25 */ public class WarmUpForThread { /** 线程名数组*/ private final String[] names = {"A","B","C"}; /** 循环执行的总长度*/ private final int size = names.length * 10; private final ReentrantLock lock = new ReentrantLock(); /** 记录最后一次写入的元素在数组的位置*/ private int latestPos = 0; /** 记录总体打印次数*/ private volatile int counter = 1; public static void main(String[] args) { WarmUpForThread demo = new WarmUpForThread(); demo.startDemo(); } /** * 开启3个线程,线程名对于数组常量 */ public void startDemo() { for(String name : names) { new PrintWorker(name).start(); } } /** * 多线程竞争执行具体打印任务的方法 * @throws InterruptedException */ public void print() throws InterruptedException { String name = Thread.currentThread().getName(); lock.lockInterruptibly(); // 可以响应线程中断信号 try{ if(names[latestPos].equals(name) && counter <= size) { latestPos = (latestPos + 1) % names.length; counter++; System.out.print(name); } } finally{ lock.unlock(); } Thread.sleep(50); } /** * 执行打印任务的线程 * @author: yanxuxin * @date: 2010-2-25 */ class PrintWorker extends Thread { public PrintWorker(String name) { super(name); } public void run() { while(counter <= size) { try { print(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
这里用于记录以操作总数的counter利用了volatile的可见性的特性。多个子线程可以同时得到最新的counter的值,又由于对counter的递增与改变latestPos值的操作是一个共同的原子操作,所以可以使用lock来确保counter++的线程安全。故基于上述的原因使用volatile关键字。另外一点是在print方法里也使用counter <= size检查条件的原因是:当counter=29,一个线程执行counter++之前,其余的线程中的一个或者多个counter <= size条件依然满足,故都进入竞争等待阶段,所以一旦进入lock块就意味着counter实际已经30了,不应该再继续打印,故print()方法内依然有此条件检查。
这个例子虽然相对简单,但是也是一样考察了线程调度的问题。暂时没有无锁实现的清晰的思路,所以只是使用另一种线程同步的机制ReentrantLock演练一下。最近开始找工作,不知笔试或者面试中能不能激发多一点的多线程方面的灵感和领悟,呵呵。找工作虽然比较难,但是希望自己能在这个陌生的城市坚持并如愿...
发表评论
文章已被作者锁定,不允许评论。
-
一道位操作的趣味编程题
2010-03-14 10:50 2085看到一道很有意思的编程题:大厅里有64盏灯,每盏灯都编 ... -
一道字符串截取的编程题
2010-03-11 10:52 2277最近接触到一道字符串截取的编程题:编写一个截取字符串的 ... -
疑似Google多线程面试题的Java实现
2010-02-24 17:39 4907来到一个完全陌生的地方,即将一切从新开始,内心兴奋又忐 ... -
Mina的线程池实现分析(2)
2010-02-10 17:31 4522分析了I/O事件的存储,下面看看多个Worker同时工 ... -
Mina的线程池实现分析(1)
2010-02-10 17:28 11575线程池是并发应用中,为了减少每个任务调用的开销增强性能 ... -
多线程基础总结十一--ConcurrentLinkedQueue
2010-02-03 17:52 12840ConcurrentLinkedQueue充分使用了a ... -
LinkedBlockingQueue应用--生产消费模型简单实现
2010-01-29 20:45 8137之前介绍时LinkedBlockingQueue提到了 ... -
多线程基础总结十--LinkedBlockingQueue
2010-01-28 14:33 15372随着多线程基础总结的增多,却明显的感觉知道的越来越少, ... -
号称放倒一片的一道J2SE基础题的个人理解
2010-01-23 14:07 2793近日无意中看到一道Java基础题,号称在接受测试的10 ... -
多线程基础总结九--Mina窥探(1)
2010-01-21 23:46 5401一直以来的多线程的基础总结都是脱离应用的,但是要说多线 ... -
多线程基础总结八--ReentrantReadWriteLock
2010-01-15 23:22 7510说到ReentrantReadWriteLock,首先 ... -
多线程基础总结七--ReentrantLock
2010-01-09 23:17 7678之前总结了部分无锁机制的多线程基础,理想的状态当然是利 ... -
关于atomic问题的一点理解
2009-12-30 16:42 2440之前看到一个帖子是关于atomic使用的,当时没有仔细 ... -
多线程基础总结六--synchronized(2)
2009-12-18 18:45 1870早在总结一时,我就尽量的把synchronized的重点 ... -
多线程基础总结五--atomic
2009-12-17 19:46 3551在简单介绍java.util.c ... -
多线程基础总结四--ThreadLocal
2009-12-16 19:48 2719说到ThreadLocal,首先 ... -
多线程基础总结三--volatile
2009-12-15 20:09 2525前面的两篇总结简 ... -
多线程基础总结二--Thread
2009-12-12 23:27 2668对于Thread来说 ... -
多线程基础总结一--synchronized(1)
2009-12-12 23:23 3068最近写关于并发的小应 ... -
由destory-method引发的IOC容器设计的思考
2009-12-07 16:51 1682第一次读Spring的源 ...
相关推荐
CC++多线程编程练习题大全,非常适合学习编程的人们。
多线程面试题
C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等
面试题c++mysql多线程操作系统 面试题c++mysql多线程操作系统 面试题c++mysql多线程操作系统 面试题c++mysql多线程操作系统 面试题c++mysql多线程操作系统
java基础之多线程的练习题,博客访问地址: http://blog.csdn.net/u014028392/article/details/76906801
常见的多线程经典面试题和答案,包含了面试中常见了多线程问题。
java面试题_多线程(68题)
JAVA多线程练习题的答案。都是一些基本的练习题。对初学者有帮助
多线程面试59题(含答案)
多线程面试59题(含答案)
多线程,多线程面试题,C#源码.zip
iOS多线程面试题
这是对Java多线程的一些相关练习题 包括选择 填空 简答 编程等题型
【面试资料】-(机构内训资料)Java多线程面试59题(含答案)_
c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程...
1. 什么是线程? 2. 什么是线程安全和线程不安全? 3. 什么是⾃旋锁? 4. 什么是CAS? 5. 什么是乐观锁和悲观锁? 6. 什么是AQS? 7. 什么是原⼦操作?在Java Concurrency API中有哪些原⼦类(atomic classes)? 8. ...
java多线程初学者练习题目,供初学者练习使用
多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程
【BAT必备】多线程面试题【BAT必备】多线程面试题【BAT必备】多线程面试题【BAT必备】多线程面试题【BAT必备】多线程面试题【BAT必备】多线程面试题【BAT必备】多线程面试题【BAT必备】多线程面试题【BAT必备】多...
2020面试题总结多线程篇.pdf