- 浏览: 2639277 次
- 性别:
- 来自: 广州
-
最新评论
-
hsluoyz:
PyCasbin是一个用Python语言打造的轻量级开源访问控 ...
权限管理的一个简单后台 -
liuyachao111:
谢谢 问题解决了
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾 -
jnjeC:
多谢博主分享,在配置文件里的&也要改成& ...
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾 -
大维啊:
同志,你这不行啊!
java 的 AccessController.doPrivileged使用 -
lisha2009:
解决了我的问题,多谢博主分享!
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾
文章列表
mina后面的业务处理是一个线程池去处理的,在线程池的多线程的情况下,一般是不能保证后面的请求一定后处理的。因为可能后面的线程处理更快。
mina是怎么做到的呢:
基本原理是 每个session有个自己的queue,而且相同这个queue的元素一定在同一个线程处理
具体原理:
mina使用的是OrderedThreadPoolExecutor,具体的处理是Worker
for (;;) {
IoSession session = fetchSession();
idleWorkers.decrement ...
简单实现一个java公平策略的锁
- 博客分类:
- 高并发
代码是:
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的多线程并发的探索
- 博客分类:
- 高并发
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
java为什么没有无符号类型
- 博客分类:
- 坑
一次对 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。
例如,假如多线程读/写同一个缓冲区: ...
通过继承LinkedHashMap实现LRU缓存
- 博客分类:
- 缓存
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 ...
java的equals容易掉的坑
- 博客分类:
- 坑
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");
...
java的Phaser,多线程分阶段执行
- 博客分类:
- 高并发
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 ...
原理很简单,就是使用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 ...