Java并发编程总结—Hadoop核心源码实例解读

五月 26th, 2011 by klose | No Comments | Filed in mapreduce, 互联网应用, 求职技术, 编程点滴

程序设计需要同步(synchronization),原因: 1)复杂的功能要求的需要使用多线程编程,线程之间存在读写共享变量。 2)读写共享变量(shared mutual variable),JVM的内存模型(Memory model: decide when and how changes made by one thread become visuble to others)受到其它因素干扰。 3)对共享变量的操作非原子性。例如 i++;就不是原子操作,它分为两部分,(1) 读i (2) i+1写入内存。如果i是线程A和线程B共享的变量,线程A在操作(1)之后,线程调度器调度调度线程B执行i++,因此两个线程在变量i产生了不一致。注意,volatile修饰符是线程操作之前更新数据,但是,上面的问题显然不是更新数据就能解决的。 4)增加互斥区(mutual exclusion)会降低执行效率,但是这是实现数据安全、功能强大的多线程编程最为重要的部分。 5)线程之间需要

Tags: , , ,

数组top K的数

五月 25th, 2011 by klose | No Comments | Filed in 求职技术, 编程点滴

给定数组,求top K的数。 算法思路: 使用快排插入排序的做法,在每次迭代求得数组第一个元素需要插入的位置m, 1)如果m恰好为k或者k-1,则停止迭代,当前数组的前k个位置的数即是前K大的数。 2)如果m < k-1, 那么只需继续对于(m+1,length)进行迭代即可。 3)如果m > k, 继续(l, m-1)迭代。 代码献上: #include <stdio.h> #include <stdlib.h> #include <unistd.h> void getRand(int* data, int length) { int i; srand((unsigned int) getpid()); //generate the array using rand() for (i = 0; i < length; i++) { data[i] = rand() % 1000; } //print the array printf(“generate the array using rand:\n”); for (i = 0; i < length; i++) { printf(“%d “, data[i]); } } int length;

JobHunting — 二分查找

五月 18th, 2011 by klose | No Comments | Filed in 求职技术, 编程点滴

算法不多说了,相信如果有人读过Jon Bentley 的《Programming Pearls》,就会十分重视这个算法了。记得上大学的时候,写的第一个程序也是这个,:-)。 #include <stdio.h> #include <stdlib.h> typedef int DataType; int length = 10; int data[] = {1, 3, 5, 23, 45, 231, 234, 754, 5632, 12345}; int bS(DataType * d, int length, DataType target) { int left = 0, right = length-1, mid; if    (length <= 0) { return -1; } while (left <= right) { mid = (right + left) >> 1; if (d[mid] > target) { right = mid – 1; } else if (d[mid] == target) { return mid; } else { left = mid + 1; } } return -1; } int main (int argc, char* argv[]) { if (argc != 2) { printf(“Usage:binarySear

Tags: ,

Linux系统调用篇1—vfork、fork、clone

五月 15th, 2011 by klose | No Comments | Filed in 编程点滴

下面是转自一个来自与JavaEye的blog:http://memorymyann.iteye.com/blog/235638 下面是blog的内容:大部分的内容都写得很好 fork,vfork,clone都是linux的系统调用,用来创建子进程的(确切说vfork创造出来的是线程)。 先介绍下进程必须的4要点: a.要有一段程序供该进程运行,就像一场戏剧要有一个剧本一样。该程序是可以被多个进程共享的,多场戏剧用一个剧本一样。 b.有起码的私有财产,就是进程专用的系统堆栈空间。 c.有“户口”,既操作系统所说的进程控制块,在linux中具体实现是task_struct d.有独立的存储空间。 当一个进程缺少d条件时候,我们称其为线程。 1.fork 创造的子进程复制了父亲进程的资源,包括内存的内容task_struct内容(2个进程的pid不同)。这里是资源的复制不是指针的复制。下面的例子可以看出 [root@l