`
文章列表
mina后面的业务处理是一个线程池去处理的,在线程池的多线程的情况下,一般是不能保证后面的请求一定后处理的。因为可能后面的线程处理更快。 mina是怎么做到的呢: 基本原理是 每个session有个自己的queue,而且相同这个queue的元素一定在同一个线程处理 具体原理: mina使用的是OrderedThreadPoolExecutor,具体的处理是Worker for (;;) { IoSession session = fetchSession(); idleWorkers.decrement ...
代码是: package com.eyu.gift.lock; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.locks.LockSupport; class FailLock { Queue<Thread> queue = new ConcurrentLinkedQueue<Thread>(); public void lock() { queue.add(Thread. ...
java的BitSet不是线程安全的,所以多线程的时候h要加锁。 1 直接加锁整个BitSet        用时:3.4秒  2 BitSet拆成更小的粒度     用时:3.6秒 3 使用并发的BitSet,自己写了个AtomicBitSet   用时:3.3秒 从测试结果来看 性能都差不多 感觉有点疑惑,在我的想象中2还和3应该会比1好不少的啊 下面3个测试分别对应3种方式 附件是完整代码 测试1 package com.eyu.gift.service; import java.util.BitSet; import java.util.Random; import ...
设置 hibernate.hbm2ddl.auto=create-drop 这样每次程序启动的时候就会先删除之前的表,然后创建一张新表,从而达到清库的目的 这个对于测试的时候是很好用的 正常情况hibernate.hbm2ddl.auto=update 这个是表示有字段增加的话,会增加数据库字段
1 下载java8 设置项目的编译级别为1.8 2  aspectj 版本换成 1.8.4 3  spring的版本换成 4.1.5.RELEASE
一次对 James Gosling 的采访说到: 你去问 C 语言开发人员关于无符号的问题,你很快就会发现没有几个 C 语言开发人员真正理解无符号类型到底发生了些什么,什么是无符号运算。这些事情让 C 语言变得复杂。我觉得 Java 语言是非常简单的。 在之前的Oak规范也有说: “8 比特,16 比特,32 比特,64 比特的,这 4 种不同宽度的整数类型都是有符号的,除非在前面加上 unsigned 修饰符”。 在侧栏中又说:“无符号类型尚未实现;可能永远也不会实现了。” 看来是为了追求简单,是故意不实现的。 不过guava是提供了UnsignedInts的。 之前在项目中玩家的战 ...
Lock对应Synchronized,使用之前都要先获取锁                       Object      Condition 休眠                wait        await 唤醒个线程      notify      signal 唤醒所有线程   notifyAll   signalAll     Condition它更强大的地方在于:能够更加精细的控制多线程的休眠与唤醒。      对于同一个锁,我们可以创建多个Condition,就是多个监视器的意思。在不同的情况下使用不同的Condition。 例如,假如多线程读/写同一个缓冲区: ...
import java.util.LinkedHashMap; import java.util.Map; /** * LinkedHashMap默认是不删除元素的,通过重写removeEldestEntry来实现最大容量 * @author bean */ public class LRUMap<K, V> extends LinkedHashMap<K, V> { private static final long serialVersionUID = 6918023506928428613L; // 最大容量 public st ...
import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertThat; import org.junit.Test; public class EqualsTest { public boolean equals(EqualsTest obj) { return true; } @Test public void test() { assertThat(new EqualsTest(), equalTo(new EqualsTest())) ...
cyclicBarrier是有自动重置功能的,我们可以用这个功能来实现分阶段: 还是之前的需求: 开启3个线程,分别打印字母a,b,c各10次,然后进入下一阶段打印后面的字母d,e,f各10次,然后再进入下一阶段.......以此类推,直到整个字母表全部打印完毕。 下面是代码,可以看到是有点麻烦的 cyclicBarrier是没有明确的分段功能的,坑爹的是如果一个线程不await,其他线程是不能进入下个阶段的。然后你要自己比较精确的去什么await,什么时候退出。 原因是Phaser有个总的状态管理,但是cyclicBarrier没有,如果单纯用await来代替Phaser的arrive,那 ...
import java.lang.reflect.Field; import java.util.Random; public class IntegerTest { public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("java.lang.Integer$IntegerCache"); Field field = clazz.getDeclaredField("cache"); ...
Phaser是处理分阶段的多线程的很好的方法: 比如需求是: 开启3个线程,分别打印字母a,b,c各10次,然后进入下一阶段打印后面的字母d,e,f各10次,然后再进入下一阶段.......以此类推,直到整个字母表全部打印完毕。 代码实现: import java.util.concurrent.Phaser; public class MyTest { public static void main(String[] args) { Phaser phaser = new Phaser(3) {// 共有3个工作线程,因此在构造函数中赋值为3 @Overr ...

java实现热更新

 
原理很简单,就是使用ClassLoader加载新的类,替换掉旧的对象。 注意最好使用接口,我们只是加载实现类,接口类一直使用旧的ClassLoader,这样就不会存在类型转换的报错。 具体的代码也可以参考我的github:https://github.com/huangyunbin/hot/tree/master public class DynamicClassLoader extends ClassLoader { public Class<?> findClass(byte[] b) throws ClassNotFoundException { retur ...
例子: 抛出的事件的int,但是我们的接收器接受的是Number,是int的父类 guava的EventBus是如何做到也能接受的呢: 在post方法的第一行: Set<Class<?>> dispatchTypes = flattenHierarchy(event.getClass()); 比如这里是int,得到的就是int的所有父类: [class java.lang.Integer, class java.lang.Number, interface java.lang.Comparable, interface java.io.Serializable, cl ...
java方法中只有一个参数是数组,反射的时候我们不能想当然的传歌数组进去,传数组进去的时候表示多个参数。 两个数组不是一个意思啊。 我们应该把数组转为objet,这样才表示一个参数。 import java.lang.reflect.Method; public class MethodTest { public void a(String[] args) { System.out.println("a"); } public static void main(String[] args) throws Exception { Meth ...
Global site tag (gtag.js) - Google Analytics