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** 是一款高性能、低延迟的并发框架,它通过无锁设计实现了高效的队列操作,从而大大提升了多线程环境下的性能表现。该框架于2011年...
SpringBoot整合Disruptor并发编程框架是针对高并发场景下性能优化的一种技术实践。Disruptor是由LMAX公司开发的一款高性能、低延迟的并发工具,它通过消除线程间的锁竞争,大大提升了多线程环境下的处理速度。...
《Spring Boot Starter Disruptor深度解析》 在现代软件开发中,高性能和低延迟往往是系统设计的关键要素。Spring Boot作为Java领域最受欢迎的微服务框架,提供了丰富的启动器(starters)来简化开发工作。"spring-...
disruptor-3.4.4.jar 官方github下载 亲测可用,大家赶紧下载吧 后续再补充其他常用jar(但不好下载的)
Disruptor3.x Disruptor使用方式 EventHandler[] eventHandlers=new DisruptorEventHandler[]{new DisruptorEventHandler()}; DisruptorPublisher dp=new DisruptorPublisher(1024, eventHandlers); dp.start(); ...
《Disruptor技术详解——基于DisruptorDemo.zip实例解析》 Disruptor,由LMAX公司开发并开源,是一款高性能、低延迟的并发工具,主要用于优化多线程间的通信。它采用一种环形缓冲区(Ring Buffer)的设计,极大地...
Disruptor是一款高性能的并发工具库,由LMAX公司开发并开源,主要应用于高频率交易系统。它通过优化线程间通信的方式,极大地提升了多线程环境下的数据处理速度。Disruptor的设计理念是避免传统的锁机制,转而采用一...
《Disruptor 框架详解与应用实例》 Disruptor 是一款高性能的并发工具库,由英国的 LMAX 公司开发并开源。它主要用于优化多线程环境下的数据共享,尤其在金融交易系统中表现卓越。Disruptor 的核心设计是一个环形...
Disruptor是由LMAX公司开发的一种高性能的并发编程框架,主要应用于金融交易系统。它通过优化数据共享方式,显著提高了多线程环境下的处理速度。在"Disruptor 多个消费者"的场景中,我们可以深入理解Disruptor如何...
Error: java.lang.NoSuchMethodError: com.lmax.disruptor.dsl.Disruptor.<init>(Lcom/lmax/disruptor/EventFactory;ILjava/util/concurrent/ThreadFactory;Lcom/lmax/disruptor/dsl/ProducerType;Lcom/lmax/...
Disruptor是由LMAX公司开发的一种高性能的并发编程框架,主要应用于金融交易系统。它以其高效、低延迟的事件处理机制而闻名。在C++版本的Disruptor中,我们同样可以享受到这种高效的并发能力,尤其适用于需要大量...
赠送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并附上demo
disruptor-3.4.2.jar 工具jar包 及 disruptor-3.4.2-sources.jar, Disruptor它是一个开源的并发框架,并获得2011 Duke’s 程序框架创新奖,能够在无锁的情况下实现网络的Queue并发操作,是 log4j2 引用的 jar 包
LMAX Disruptor是一款高性能的消息处理框架,由LMAX公司开发并开源,它在金融交易领域有着广泛的应用。Disruptor的设计目标是解决多线程环境下的数据共享问题,通过优化并发性能,实现极低的延迟和高吞吐量。在Java...
《Disruptor应用实例》 Disruptor是高性能并发编程领域的一个重要工具,由LMAX公司开发并开源,主要用于优化多线程环境下的数据处理。它通过一种创新的数据同步方式,极大地提升了系统的吞吐量和响应速度。在本文中...
赠送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,由LMAX公司开源的一款并发框架,为处理高并发场景提供了一种新颖且高效的解决方案。它通过消除锁和...