坚信科学,分享技术

Tag Archives: synchronize

java线程控制器代码分享-根据cpu情况决定线程运行数量和情况

在人人网海量存储系统的存储引擎部分,为了提高CPU和网络的使用情况,使用了java多线程管理并行操作的方式。 在java中控制线程是一件很简单的事情,jdk提供了诸多的方法,其中比常用的两个是notify()和wait(),一个是唤醒,一个等待线程,在下面的代码中,将看到一个线程分配器,根据cpu的负载情况,自动完成对应线程的唤醒或者是等待操作。整个过程是一个平滑的过程,不会因为线程的切换而导致机器负载出线锯齿。 先看一个类,读取Linux系统TOP等指令拿到系统当前负载: import java.io.BufferedReader; import java.io.InputStreamReader; /** * 节点的cpu 内存 磁盘空间 情况 * * @author zhen.chen * */ public class NodeLoadView { /** * 获取cpu使用情况 * * @return * @throws Exception */ public double getCpuUsage() throws Exception { double …

Continue reading

Posted in java | Tagged , , , | 2 Comments

人人网内部培训:java并发编程原理-synchronize volatile-张洁大侠

来自人人网内部培训的最新消息: 北京时间今天下午不明时间,一群人在张洁大侠的培训下,对java并发编程原理-synchronize volatile等进行了激励的讨论和学习。出席本次会议的有。。。 言归正传,说,并发,就会出现锁。 1.互斥锁实现算法 使用一个并发队列: do{ pre=head; newNode->next=prev; }while(!cas(head,prev,newNode)); 此代码中cas是操作系统提供的compare and swap接口,能保证原子性操作(类似memcache的cas)。 2.编译器指令优化使内存指令重排序与并发编程 并发的程序会受到指令重排序的影响,顺序执行的程序逻辑不会受影响。 例子: int a=b=0; Thead1 { a=1; b=2 } Thread2 { if(b==2) { System.out.println(a); //这个a会是多少? } } 上例中Thread2并不一定会打出1来,因为在Thread1中的两个指令会被编译器优化时交换了顺序,出现了与我们想像中不一样的逻辑。 3.增加synchronize抑制内存指令重排序 synchronize的作用是什么呢,经常都说是同步,市面上的说法是,jvm在运行的时候,变量会在本地有一个内存区,另外还有一个主存区,同步的含义就是将本地的值同步到主存去。 这个说法没有明确的错误,而且在一定程度上还能帮助你理解synchronize的作用,然而内部真正的原因,是利用synchronize建立内存屏障,使其能够抑制内存指令的重排序,从而使并发程序达到我们想像中的

Continue reading

Posted in java | Tagged , , | 3 Comments