`
weigang.gao
  • 浏览: 491723 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Disruptor预备知识

 
阅读更多

1.sun.misc.Unsafe 示例

package com.java.magic.part4.exception;

import java.lang.reflect.Field;

import sun.misc.Unsafe;

class Target{
	
	int intParam = 3;
	
	long longParam;
	
	String strParam;
	
	String strParam1;
}

public class UnsafeTest {
	
	private static Unsafe unsafe;
	
	static{
		try {
			//通过反射获取theUnsafe
			Field field = Unsafe.class.getDeclaredField("theUnsafe");
			field.setAccessible(true);
			unsafe = (Unsafe)field.get(null);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws Exception {
		
		Class clazz = Target.class;
		Field[] fields = clazz.getDeclaredFields();
		System.out.println("fieldNameeeee:fieldOffset");
		for(Field f : fields){
			//获取属性偏移量,可以通过这个偏移量给属性设值
			System.out.println(f.getName()+" : "+unsafe.objectFieldOffset(f));
		}
		System.out.println("--------------------------------");
		Target target = new Target();
		Field intParam = clazz.getDeclaredField("intParam");
		int a = (Integer) intParam.get(target);
		System.out.println("intParam原始值:"+a);
		long intParamOffset = unsafe.objectFieldOffset(intParam);
		System.out.println("intParam实例变量偏移量:"+intParamOffset);
		//intParam实例变量偏移量是offset 原始值是3,我们要改成10
		System.out.println(unsafe.compareAndSwapInt(target, intParamOffset, 3, 10));
		System.out.println("intParam改变之后的值:"+target.intParam);
		
		System.out.println("--------------------------------");
		//这个时候已经改为10了,所以会返回false  
        System.out.println(unsafe.compareAndSwapInt(target, intParamOffset, 3, 10)); 
        
        System.out.println("--------------------------------");
        Field strParam = clazz.getDeclaredField("strParam");
        String str = (String) strParam.get(target);
        System.out.println("strParam原始值:"+str);
        long strParamOffset = unsafe.objectFieldOffset(strParam);
        System.out.println("strParam实例变量的偏移量是:"+strParamOffset);
        System.out.println(unsafe.compareAndSwapObject(target, strParamOffset, null, "5")); 
		System.out.println("strParam改变之后的值:"+target.strParam);
		
		
	}
	

}

 

2.java.util.concurrent.locks.Condition

package com.java.magic.part4.exception;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class NumberWrapper{
	
	public int value = 1;
}

public class ConditionTest {
	
	public static void main(String[] args) {
		
		//初始化可重入锁
		final Lock lock = new ReentrantLock();
		
		//第一个条件当屏幕上输出到3
		final Condition reachThreeCondition = lock.newCondition();
		
		//第二个条件当屏幕上输出到6
		final Condition reachSixCondition = lock.newCondition();
		
		//NumberWrapper只是为了封装一个数字,一边可以将数字对象共享
		final NumberWrapper num = new NumberWrapper();
		
		//初始化A线程,这个线程输出123, 789
		Thread threadA = new Thread(new Runnable() {
			
			@Override
			public void run() {
		        //reachThreeCondition.signal(); 这个东西需要放到lock.lock()和lock.unlock()之间使用
				lock.lock();
				try{
					while(num.value <= 3){
						System.out.println(Thread.currentThread().getName()+" : "+(num.value++));
					}
					reachThreeCondition.signal();//唤醒由reachThreeCondition.await()造成阻塞的线程
				} finally{
					lock.unlock();
				}
				
				
				lock.lock();
				try {
					if(num.value < 6){
						reachSixCondition.await();//阻塞当前线程,直到reachSixCondition.signal()唤醒当前线程
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				} finally{
					lock.unlock();
				}
				
				while(num.value <= 9){
					System.out.println(Thread.currentThread().getName()+" : "+(num.value++));
				}
				
			}
		});
		
		//初始化B线程,这个线程输出456
		Thread threadB = new Thread(new Runnable() {
			
			@Override
			public void run() {
			    lock.lock();
			    try{
			    	 if(num.value < 3){
						 reachThreeCondition.await();//阻塞当前线程,直到reachThreeCondition.signal()唤醒当前线程
		             }
			    } catch(Exception e){
			    	
			    } finally{
			    	lock.unlock();
			    }

			    lock.lock();
			    try{
			    	while(num.value <= 6){
						System.out.println(Thread.currentThread().getName()+" : "+(num.value++));
					}
			    	reachSixCondition.signal();//唤醒由reachSixCondition.await()造成阻塞的线程
			    } finally{
			    	lock.unlock();
			    }
			    
				
			}
		});
		
		//
		threadA.start();
		threadB.start();
		
		
	}

}

3.求以2为低N的对数

方法1(推荐)

	public static int log2(int i)
    {
        int r = 0;
        while ((i >>= 1) != 0)
        {
            ++r;
        }
        return r;
    }

 方法2

Math.log(N)/Math.log(2)

 

 

4.获取long类型的数组中首个元素的偏移量和每个元素的所占内存空间大小

public static void unsafeTest() throws Exception{
	     Unsafe unsafe = getUnsafe();
	     
	     //获取long类型的数组中首个元素的偏移量
	     int offset = unsafe.arrayBaseOffset(long[].class);
	     //获取long类型的数组中为每个元素分配的内存空间大小
	     int scale = unsafe.arrayIndexScale(long[].class);
	     System.out.println("offset:"+offset+", scale:"+scale);
	     
	     long[] buffer = new long[10];
	     //unsafe
	     unsafe.putOrderedLong(buffer, offset+	16, 1003l);
	     
	     
	     System.out.println(buffer[2]);
	     
	     
	    
	}

 

 

5.AtomicReferenceFieldUpdater类

package com.java.magic.part4.exception;

import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;


import sun.misc.Unsafe;

public class Test {
	
	protected volatile String[] names = new String[0];

	/**
	 * 参考:http://huangyunbin.iteye.com/blog/1944153
	 * AtomicReferenceFieldUpdater<AbstractSequencer, Sequence[]> SEQUENCE_UPDATER =
		        AtomicReferenceFieldUpdater.newUpdater(AbstractSequencer.class, Sequence[].class, "gatingSequences");
	 */
	public static void AtomicReferenceFieldUpdaterTest() throws Exception{
		
		AtomicReferenceFieldUpdater<Test, String[]> updater = AtomicReferenceFieldUpdater.newUpdater(Test.class, String[].class, "names");
		
		Test test = new Test();
	    System.out.println(test.names);
		System.out.println(updater.get(test)); //获取对象里面的成员变量,说明获取的是Test中的names
	}
}

 

6.Arrays.copyOf() 方法

	public static void arraysCopyOf(){
		
		String[] names = {"高伟刚","高红成","高显兵"};
		System.out.println("names length:"+names.length);
		String[] newnames = Arrays.copyOf(names, 5);
		System.out.println("newnames length:"+newnames.length);
		for(int i =0 ; i< newnames.length; i++){
			System.out.println(newnames[i]);
		}
	}

 

7.jdk5新特性:可变参数

/*
	 * 如果传的是数组的话,那么names的长度是数据的大小
	 */
	public static void paramTest(String... names){
		
		System.out.println(names.length);
	}

 

 

 

 

 

分享到:
评论

相关推荐

    Disruptor并发框架中文参考文档

    ### Disruptor并发框架知识点详解 #### 一、Disruptor简介及原理 **Disruptor** 是一款高性能、低延迟的并发框架,它通过无锁设计实现了高效的队列操作,从而大大提升了多线程环境下的性能表现。该框架于2011年...

    springboot整合Disruptor并发编程框架 #资源达人分享计划#

    SpringBoot整合Disruptor并发编程框架是针对高并发场景下性能优化的一种技术实践。Disruptor是由LMAX公司开发的一款高性能、低延迟的并发工具,它通过消除线程间的锁竞争,大大提升了多线程环境下的处理速度。...

    spring-boot-starter-disruptor.zip

    《Spring Boot Starter Disruptor深度解析》 在现代软件开发中,高性能和低延迟往往是系统设计的关键要素。Spring Boot作为Java领域最受欢迎的微服务框架,提供了丰富的启动器(starters)来简化开发工作。"spring-...

    disruptor-3.4.4.jar disruptor 3.4.4 jar 官方github下载

    disruptor-3.4.4.jar 官方github下载 亲测可用,大家赶紧下载吧 后续再补充其他常用jar(但不好下载的)

    Disruptor3.x Disruptor使用方式

    Disruptor3.x Disruptor使用方式 EventHandler[] eventHandlers=new DisruptorEventHandler[]{new DisruptorEventHandler()}; DisruptorPublisher dp=new DisruptorPublisher(1024, eventHandlers); dp.start(); ...

    DisruptorDemo.zip

    《Disruptor技术详解——基于DisruptorDemo.zip实例解析》 Disruptor,由LMAX公司开发并开源,是一款高性能、低延迟的并发工具,主要用于优化多线程间的通信。它采用一种环形缓冲区(Ring Buffer)的设计,极大地...

    Disruptor demo

    Disruptor是一款高性能的并发工具库,由LMAX公司开发并开源,主要应用于高频率交易系统。它通过优化线程间通信的方式,极大地提升了多线程环境下的数据处理速度。Disruptor的设计理念是避免传统的锁机制,转而采用一...

    disruptor jar包+Demo+Api

    《Disruptor 框架详解与应用实例》 Disruptor 是一款高性能的并发工具库,由英国的 LMAX 公司开发并开源。它主要用于优化多线程环境下的数据共享,尤其在金融交易系统中表现卓越。Disruptor 的核心设计是一个环形...

    disruptor 多个消费者

    Disruptor是由LMAX公司开发的一种高性能的并发编程框架,主要应用于金融交易系统。它通过优化数据共享方式,显著提高了多线程环境下的处理速度。在"Disruptor 多个消费者"的场景中,我们可以深入理解Disruptor如何...

    disruptor-3.3.8.jar

    Error: java.lang.NoSuchMethodError: com.lmax.disruptor.dsl.Disruptor.&lt;init&gt;(Lcom/lmax/disruptor/EventFactory;ILjava/util/concurrent/ThreadFactory;Lcom/lmax/disruptor/dsl/ProducerType;Lcom/lmax/...

    Disruptor C++版(仅支持单生产者)

    Disruptor是由LMAX公司开发的一种高性能的并发编程框架,主要应用于金融交易系统。它以其高效、低延迟的事件处理机制而闻名。在C++版本的Disruptor中,我们同样可以享受到这种高效的并发能力,尤其适用于需要大量...

    disruptor-3.3.0-API文档-中文版.zip

    赠送jar包:disruptor-3.3.0.jar; 赠送原API文档:disruptor-3.3.0-javadoc.jar; 赠送源代码:disruptor-3.3.0-sources.jar; 赠送Maven依赖信息文件:disruptor-3.3.0.pom; 包含翻译后的API文档:disruptor-...

    disruptor案例加简单说明

    简单讲解disruptor并附上demo

    disruptor-3.4.2.jar 及 disruptor-3.4.2-sources.jar

    disruptor-3.4.2.jar 工具jar包 及 disruptor-3.4.2-sources.jar, Disruptor它是一个开源的并发框架,并获得2011 Duke’s 程序框架创新奖,能够在无锁的情况下实现网络的Queue并发操作,是 log4j2 引用的 jar 包

    LMAX disruptor jar包+Demo+Api+src源码 disruptor-3.0.1.jar

    LMAX Disruptor是一款高性能的消息处理框架,由LMAX公司开发并开源,它在金融交易领域有着广泛的应用。Disruptor的设计目标是解决多线程环境下的数据共享问题,通过优化并发性能,实现极低的延迟和高吞吐量。在Java...

    Disruptor应用实例

    《Disruptor应用实例》 Disruptor是高性能并发编程领域的一个重要工具,由LMAX公司开发并开源,主要用于优化多线程环境下的数据处理。它通过一种创新的数据同步方式,极大地提升了系统的吞吐量和响应速度。在本文中...

    disruptor-3.3.0-API文档-中英对照版.zip

    赠送jar包:disruptor-3.3.0.jar; 赠送原API文档:disruptor-3.3.0-javadoc.jar; 赠送源代码:disruptor-3.3.0-sources.jar; 赠送Maven依赖信息文件:disruptor-3.3.0.pom; 包含翻译后的API文档:disruptor-...

    Java工具:高性能并发工具Disruptor简单使用

    Java工具:高性能并发工具Disruptor简单使用 在Java编程中,高效并发处理是优化系统性能的关键之一。Disruptor,由LMAX公司开源的一款并发框架,为处理高并发场景提供了一种新颖且高效的解决方案。它通过消除锁和...

Global site tag (gtag.js) - Google Analytics