- 博客(10)
- 资源 (1)
- 收藏
- 关注
原创 JDK读写锁ReadWriteLock的升级和降级问题
JDK提供了写锁接口ReadWriteLock和它的实现ReentrantReadWriteLock。要实现一个读写锁,需要考虑很多细节,其中之一就是锁升级和锁降级的问题。什么是升级和降级呢?ReadWriteLock的javadoc有一段话:Can the write lock be downgraded to a read lock without allowing an interven
2014-07-31 14:23:14 10574 1
原创 可重入锁的获取和释放需要注意的一点儿事
什么是可重入锁,不可重入锁呢?"重入"字面意思已经很明显了,就是可以重新进入。可重入锁,就是说一个线程在获取某个锁后,还可以继续获取该锁,即允许一个线程多次获取同一个锁。比如synchronized内置锁就是可重入的,如果A类有2个synchornized方法method1和method2,那么method1调用method2是允许的。显然重入锁给编程带来了极大的方便。假如内置锁不是可
2014-07-31 09:06:57 3921
原创 java.util.concurrent.locks.Lock类的lock和lockInterruptibly方法的区别
什么是可中断的锁获取呢?就是:线程在等待获取锁的过程中,是否能够响应中断,以便在被中断的时候能够解除阻塞状态,而不是傻傻地一直在等待。java对象的内置锁(synchronized)就是一种不可中断的锁,也就是说如果一个线程在等待获取某个对象的内置锁,就算是该线程被其他线程中断,该线程仍然继续等待内置锁,而不是解除阻塞状态,也不会抛出InterruptedException。Lock类
2014-07-30 13:43:40 1766
原创 java获取Unsafe类的实例和取消eclipse编译的错误和警告
JRE的rt.jar中提供了一个类sun.misc.Unsafe,虽然这个类因为其不其安全性,不建议使用,而且被加了诸多限制;但是在很多场合下我们确实需要这个类提供的强大功能。JDK类库下的NIO和concurrent包下的很多类都使用到了Unsafe类,如AtomicInteger和AbstractQueuedSynchronizer等。 JDK源码中对这个类进行了严格限制,我们
2014-07-29 20:01:37 5818
原创 ExecutorService.invokeAny()和ExecutorService.invokeAll()的使用剖析
ExecutorService是JDK并发工具包提供的一个核心接口,相当于一个线程池,提供执行任务和管理生命周期的方法。ExecutorService接口中的大部分API都是比较容易上手使用的,本文主要介绍下invokeAll和invokeAll方法的特性和使用。我们先提供几个任务类:一个耗时任务,一个异常任务,一个短时任务。他们会在接下来的测试代码中使用。package tasks;im
2014-07-27 16:15:07 7533 2
原创 JDK并发工具包CompletionService和ExecutorCompletionService的好处和使用场景
《Java并发编程实践》一书6.3.5节CompletionService:Executor和BlockingQueue,有这样一段话: "如果向Executor提交了一组计算任务,并且希望在计算完成后获得结果,那么可以保留与每个任务关联的Future,然后反复使用get方法,同时将参数timeout指定为0,从而通过轮询来判断任务是否完成。这种方法虽然可行,但却有些繁琐。幸运的是,还有一种
2014-07-27 13:39:11 6654 3
原创 java只使用try和finally不使用catch的原因和场景
JDK并发工具包中,很多异常处理都使用了如下的结构,如AbstractExecutorService,即只有try和finally没有catch。class X { private final ReentrantLock lock = new ReentrantLock(); // ... public void m() { lock.lock();
2014-07-26 17:19:18 21629 1
原创 使用struts2的标签s:if获取url中的参数值,并与字符串常量进行比较
大家都知道,jsp中最好不要写java脚本,稍微复杂一点的逻辑都会让代码十分难看,对于维护来说简直是噩梦。但是我们又不可能完全不在jsp中写java脚本,像这种方式,很方便而且也不会让代码很难看。当jsp中需要有复杂的逻辑判断或者循环的时候,最好使用标签库来提高代码的可维护性,比如标准的JSTL库,还有很常用的struts2标签库。比如有一个url http://127.0.0.1:8080/
2014-07-14 18:52:08 3338
原创 在并发环境下使用HashMap导致的线程死循环问题
最近和维护的一个同事定位产品的线上问题,遇到了线程卡死的情况。最终的根源就是:缓存是通过HashMap实现的,而且没有使用同步机制。在多线程环境下,更新/获取HashMap的值,导致了线程进入了死循环。JDK文档中明确说了HashMap不是线程安全的,所以在没有任何加锁的情况下,在多线程中使用HashMap本身就是严重的错误。
2014-07-09 14:39:12 2906
原创 java文件读取的路径问题解惑和最佳实践,让你远离FileNotFoundException
使用java读取jar或war下的配置文件,是开发者经常需要处理的事情,大家是不是经常遇到FileNotFoundException呢?java读取文件的方式也有很多,比如new File(),Class.getResource(),ClassLoader.getResource(),这些方式的差别是什么呢?开源框架struts2的ClassLoaderUtils和Spring提供ClassPat
2014-07-02 23:22:38 18181 1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人