- 浏览: 132046 次
- 性别:
- 来自: ...
最新评论
文章列表
历经近一个月,终于进入了收尾的阶段。这段时间参加了不少的笔试,机试,面试,在被选择与选择之间调整和锻炼心态,也很幸运的找到自己想要从事的工作。在这个过程中也根据不同的要求强化充实自己。
以前从 ...
看到一道很有意思的编程题:大厅里有64盏灯,每盏灯都编了号码,分别为1-64。每盏灯都由一个开关来控制。(开关按一下,灯亮,再按一下灯灭。开关的编号与被控制的灯相同。)开始时,灯是全灭的。现在按照以下规则按动开关。 第一次,将所有的灯点亮。 第二次,将所有2的倍数的开关按一下。 第三次,将所有3 的倍数的开关按一下。以此类推。第N次,将所有N的倍数的开关按一下。 问第N次(N小于等于64)按完以后,大厅里还有几盏灯是亮的。提示可以用long型数字去做,很巧妙刚刚好表示64位,0或者1代表打开或者关闭。写了个实现和原作者的基本思路是一样的:
/**
*
* @author: ya ...
最近接触到一道字符串截取的编程题:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个"。
了解Java的都知道Java中char是用Unicode-16表示的,char型占两个字节。通常采用Unicode-16的编码,一个代码单元就可以表示一个字符,极特殊的辅助字符需要一对代码单元来表示。String的length()方法返回的就是代码单元的数量。问题就在于汉字也好,普通字母数字也好基本上都 ...
保持对知识点或者技术的熟悉度对于程序员至关重要,要学会一个技术点可能不需要很多精力或者时间,但是要精通或者长时间保持对其的熟悉程度往往非常困难。个人的观点是通过演练对自己掌握的知识点保鲜是一个很好的途径。这其中包括了写Blog阐述,对周围的爱好者演讲,与其他程序员交流辩论以及最重要的多找机会去写相关的程序或者解决相关的问题,难点来加深理解和延长熟悉度。所以我通过写Blog和找相关的问题解决来试图延长对某个知识点的熟知度,毕竟长时间不用,不理会的东西不管什么都会自然的被遗忘。多线程相关的编程对于Web应用开发过程中使用的机会很少,所以只有自己找一些题目或者问题演练。
之前看到过这 ...
来到一个完全陌生的地方,即将一切从新开始,内心兴奋又忐忑。这几天忙着租房,装宽带直到今天才算告一段落,几经折腾,总算能安静的写写东西了。对我而言排解紧张情绪和压力的方式,就是投入一个问题的思考和解决中。之前在网上找相关的多线程问题,想通过演练来加深和熟练对多线程的掌握时,看到一个疑似Google的多线程面试题,感觉可以思考一下,题目如下:
启动4个线程,向4个文件A,B,C,D里写入数据,每个线程只能写一个值。
线程1:只写1
线程2:只写2
线程3:只写3
线程4:只写4
4个文件A,B,C,D。
程序运行起来,4个文件的写入结果 ...
新年伊始,折腾了一把x61。农历年一过又回头清理了一把t61,把ssd+硬盘托架又换到了t61上。顶着显卡门的隐患重新启用t61作为主力机器,相比之下还是小T比较快啊,写代码心理感觉更爽了一点,哈哈。JQuery用的不能说熟练 ...
分析了I/O事件的存储,下面看看多个Worker同时工作时I/O事件的取得过程。首先看看有序的Worker的实现:
private class Worker implements Runnable {
private volatile long completedTaskCount;
private Thread thread;
public void run() {
thread = Thread.currentThread();
try {
...
线程池是并发应用中,为了减少每个任务调用的开销增强性能而经常使用的技术。在mina中大量的使用这一技术,除了Executors的工厂方法构建线程池之外,它还继承自ThreadPoolExecutor提供自己的线程池的实现OrderedThreadPoolExecutor和UnorderedThreadPoolExecutor。这两者主要应用于ExecutorFilter过滤器。这个过滤器是mina内部实现的众多过滤器之一,其主要作用是把I/O events提交给线程池同时处理同一个IOSession的事件,其默认的线程池的构造是前者。这两个线程池的区别就在于同时处理I/O事件时,前者能够 ...
ConcurrentLinkedQueue充分使用了atomic包的实现打造了一个无锁得并发线程安全的队列。对比锁机制的实现,个人认为使用无锁机制的难点在于要充分考虑线程间的协调。简单的说就是多个线程对内部数据结构进行访问时,如果其中一个线程执行的中途因为一些原因出现故障,其他的线程能够检测并帮助完成剩下的操作。这就需要把对数据结构的操作过程精细的划分成多个状态或阶段,考虑每个阶段或状态多线程访问会出现的情况。上述的难点在此次分析的并发Queue的实现中有很好的说明。首先看看其部分源码:
public class ConcurrentLinkedQueue<E> extend ...
之前介绍时LinkedBlockingQueue提到了Queue主要应用于“生产消费模型”的实现。在尝试分析ConcurrentLinkedQueue之前,写了个简陋的“生产消费模型”的实现。分享的同时加深对LinkedBlockingQueue的印象,顺便再说说其特性:
import java.util.Scanner;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
im ...
随着多线程基础总结的增多,却明显的感觉知道的越来越少,好像转了一圈又回到了什么都不懂的起点。不过还是试着介绍一下队列的并发实现,努力尽快的驱散迷雾。队列这个数据结构已经很熟悉了,利用其先进先出的特性,多数生产消费模型的首选数据结构就是队列。对于有多个生产者和多个消费者线程的模型来说,最重要是他们共同访问的Queue是线程安全的。JDK中提供的线程安全的Queue的实现还是很丰富的:ArrayBlockingQueue,LinkedBlockingQueue,PriorityBlockingQueue,DelayQueue,ConcurrentLinkedQueue等等,多数情况下使用这些 ...
近日无意中看到一道Java基础题,号称在接受测试的1000名人中,仅有1.5%的程序员或者项目经理完全正确。原题是3个小程序并要求按顺序答题,我修改了一下弄成一个例子。个人觉得虽然是三个稍微不同的例子,但是考察的本质都是一样,只要了解了原理就是100个变种也还是表达一个意思。先来看看例子:
/**
*
* @author: yanxuxin
* @date: 2010-1-18
*/
public class Child extends Father{
static {
System.out.println("child-->static ...
一直以来的多线程的基础总结都是脱离应用的,但是要说多线程的应用就不能不说Mina。Apache Mina作为一个高性能的Java异步并发网络通讯框架,其内部的多线程的设计和实现可谓是学习多线程的良药。手上的Mina源码是svn剪下来的最新的代码,mvn转化成eclipse项目后导入mina-core的源码看看多线程的应用吧。
首先简单的介绍在org.apache.mina.core.service包里的核心接口之一:IoService。这个接口是对于服务器端接收连接和客户端发起连接这两种服务的顶层抽象,所以就有了IoAcceptor和IoConnector两个子接口的继承与隔离 ...
说到ReentrantReadWriteLock,首先要做的是与ReentrantLock划清界限。它和后者都是单独的实现,彼此之间没有继承或实现的关系。然后就是总结这个锁机制的特性了:
(a).重入方面其内部的WriteLock可以获取ReadLock,但是反过来ReadLock想要获得WriteLock则永远都不要想。
(b).WriteLock可以降级为ReadLock,顺序是:先获得WriteLock再获得ReadLock,然后释放WriteLock,这时候线程将保持Readlock的持有。反过来ReadLock想要升级为WriteLock则不可能,为什么 ...
之前总结了部分无锁机制的多线程基础,理想的状态当然是利用无锁同步解决多线程程序设计的问题。但是实际碰到的问题使得很多情况下,我们不得不借助锁同步来保证线程安全。自从JDK5开始,有两种机制来屏蔽代码块在并行访问的干扰,synchronized关键字已经介绍过了部分内容,所以这次简单的说说另一种锁机制:ReentrantLock。
对于synchronized的缺点之前也简单的说了一些,实际使用中比较烦扰的几点是:a.只有一个"条件"与锁相关联,这对于大量并发线程的情况是很难管理(等待和唤醒);b.多线程竞争一个锁时,其余未得到锁的线程只能不停的尝试获得锁,而 ...