- 浏览: 82861 次
- 性别:
- 来自: 西安
最新评论
文章列表
设计模式之(一.2)单例-双重检查锁定问题
- 博客分类:
- 设计模式
来自:http://www.ibm.com/developerworks/cn/java/j-dcl.html
单例创建模式是一个通用的编程习语。和多线程一起使用时,必需使用某种类型的同步。在努力创建更有效的代码时,Java 程序员们创建了双重检查锁定习语,将其和单例创建模式一起使用,从而限制同步代码量。然而,由于一些不太常见的 Java 内存模型细节的原因,并不能保证这个双重检查锁定习语有效。它偶尔会失败,而不是总失败。此外,它失败的原因并不明显,还包含 Java 内存模型的一些隐秘细节。这些事实将导致代码失败,原因是双重检查锁定难于跟踪。在本文余下的部分里,我们将详细介绍双重检查锁定 ...
来自:http://lavasoft.blog.51cto.com/62575/99155
二、同步和锁定
1、锁的原理
Java中每个对象都有一个内置锁
当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。
Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我们拿Java线程(二)中的一个例子简单的实现一下和sychronized一样的效果,代码如下:
public class
来自:http://www.goldendoc.org/2011/06/juc_concurrenthashmap/
ConcurrentHashMap
ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap加锁。
ConcurrentHashMap的内部结构
ConcurrentHashMap为了提高本身的并发能力,在 ...
java 基础之容器(Collection)
- 博客分类:
- Java基础
来自:http://zhhxxx.iteye.com/blog/654048
Collection ├List │ ├LinkedList │ ├ArrayList │ └Vector │ └Stack └Set └HashSet Map ├Hashtable ├HashMap └WeakHashMap Iterator └ListIterator 一、集合的层次结构: collection是集合接口
java 并发之(三)并发容器概览
- 博客分类:
- Java并发
来自:http://rdc.taobao.com/team/jm/archives/539
最常用及重要的是 BlockingQueue、ConcurrentMap、CopyOnWriteArrayList。
1. java.util.concurrent所提供的并发容器java.util.concurrent提供了多种并发容器,总体上来说有4类,队列类型的BlockingQueue和 ConcurrentLinkedQueue,Map类型的ConcurrentMap,Set类型的ConcurrentSkipListSet和CopyOnWriteArraySet,List类型 ...
netty 源码分析之(八)Channel
- 博客分类:
- netty
和Channel相关的接口及类结构图如下:
从该结构图也可以看到,Channel主要提供的功能如下:
1)当前Channel的状态信息,比如是打开还是关闭等。
2)通过ChannelConfig可以得到的Channel配置信息。
3)Channel所支持的如read、write、bind、connect等IO操作。
4)得到处理该Channel的ChannelPipeline,既而可以调用其做和请求相关的IO操作。
在Channel实现方面,以通常使用的nio socket来说,Netty中的NioServerSocketChannel和NioSocketChannel分别封 ...
来自:http://fbi.taobao.org/?p=51
整体的类图在API文档上已经有了详细的说明:http://netty.io/docs/stable/api/
基本上的类都是继承自AbstractChannelBuffer,其他的都是接口或者工厂类,另外也有部分会实现WrappedChannelBuffer接口。
这里使用了典型的模板模式,AbstractChannelBuffer中会统一负责实现read和write的时候改变readIndex和writeIndex的逻辑,而具体的子类则实现底层的数据拷贝逻辑,比如HeapChannelBuffer和
并发:http://ifeve.com/
逍遥冲:http://www.xiaoyaochong.net/
黄金档:http://www.goldendoc.org/2011/06/juc_condition/
不积跬步无以至千里:http://blog.csdn.net/ghsau/article/category/793599
4.FutureTask 我们先来学习一下JDK1.5 API中关于这个类的详细介绍: “取消的异步计算。利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法,此类提供了对 Future 的基本实现。仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。 可使用 FutureTask 包装 Callable 或 Runnable 对象。因为 FutureTask 实现了 Runnable,所以可将 FutureTask 提交给 Executor 执行。 除了作为一个独立的类外,此类还提供了 protect ...
来自:http://janeky.iteye.com/blog/769965
Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可以帮助开发者编写高效、易维护、结构清晰的Java多线程程序。从这篇blog起,我将跟大家一起共同学习这些新的Java多线程构件 1. CountDownLatch (闭锁-倒数的锁) 我们先来学习一下JDK1.5 API中关于这个类的详细介绍: “一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 用给定的计数 初始化 CountDownLatch ...
Java基础之final用法
- 博客分类:
- Java基础
来自:http://blog.csdn.net/roofalison/article/details/2087749
1.
修饰基础数据成员的final
这是final的主要用途,其含义相当于C/C++的const,即该成员被修饰为常量,意味着不可修改。如java.lang.Math类中的PI
Web之Servlet生命周期
- 博客分类:
- Web
来自:http://www.cnblogs.com/cuiliang/archive/2011/10/21/2220671.html
Servlet生命周期分为三个阶段:
1,初始化阶段 调用init()方法
2,响应客户请求阶段 调用service()方法
3,终止阶段 调用destroy()方法
Servlet初始化阶段:
在下列时刻Servlet容器装载Servlet:
1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码 ...
java 基础之覆盖和重载
- 博客分类:
- Java基础
来自:http://blog.csdn.net/lenotang/article/details/2681525
方法的重载(overload)和覆盖(override)
有的时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数。例如我们最常用的System.out.println()能够打印出任何数据类型的数据,它有多种实现方式。运行时,Java虚拟机先判断给定参数的类型,然后决定执行哪个
在Java API对Object类的方法hashCode有如下描述:
hashCode
public int hashCode()
返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常规协定是:
在 Java 应用程序执行期间 ...