- 浏览: 876545 次
- 性别:
- 来自: 北京
-
博客专栏
-
-
Java Concurre...
浏览量:98102
最新评论
-
guo_guo_guo:
mark
Zookeeper 安装和配置 -
solrer:
xunux 写道windows下,dataDir目录若是用需要 ...
Zookeeper 安装和配置 -
kevlearnjava:
你好 我是按照你的伪集群进行配置的 然后启动第二个和第三个 ...
Zookeeper 安装和配置 -
筑浪小子:
博主应该把vector设定为全局变量,更加清晰一些
线程安全的集合类--Java Concurrency In Practice C05读书笔记 -
tt5753:
jps16437 QuorumPeerMain16663 Zo ...
Zookeeper 安装和配置
文章列表
[本文是我对Java Concurrency In Practice第三章的归纳和总结, 也有部分语句摘自周志明所著的"深入理解java虚拟机". 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正. ]
线程安全包含2个方面: 原子性和可见性, java的同步机制都是围绕这2个方面来确保线程安全的.
可见性
理解可见性首先要清楚为什么多线程环境下会有可见性问题.
现代CPU一般都使用读写速度很快的高速缓存来作为内存和CPU之间的缓冲, 高速缓存的引入可以有效的解决CPU和内存的速度矛盾, 但是也带来了新的问题: 缓存一致性. 在多CPU的系统中, 每 ...
[本文是我对Java Concurrency In Practice第二章的归纳和总结, 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正. ]
多线程环境下,无需调用方进行任何同步处理也能保证正确性的类是线程安全的类
无状态的对象是线程 ...
最近看到几篇精彩的文章:
存取之美 —— HashMap原理、源码、实践
Hash碰撞与拒绝服务攻击
这些文章让我收获良多, 但是有些地方说的不够详细, 在此写下本人对上述文章的总结和理解, 希望可以给需要的朋友带来一些帮助.
1. 概述
HashMap在底层采用数组+链表的形式存储键值对.
在HashMap中定义了一个内部类Entry<K, V>, 该内部类是对key-value的抽象. Entry类包含4个成员: key, value, hash, next. key和value的意义很清晰, hash表示key的hash值, next是指向下一个Entry对象的 ...
[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
创建对象的方法很多, 常见的有构造函数, 静态工厂方法, 工厂方法等.
以上三种方法不适合创建需要提供多个参数的对象, 而其中某些参数是可选的场景.
考虑一个Person类:
public class Person {
// 必须的参数
private int id;
private String name;
private int age;
// 可选参数
private String city;
private String hoby;
private Str ...
[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
singleton模式是大多数javaer耳熟能详的, 不过要做到真正的单例其实很不容易, 你需要考虑以下问题:
1. 延迟加载时多线程环境下是否能保证单例?
2. 是否可以通过暴力反射获得新的对象?
3. 是否可以通过clone方法获得新的对象?
4. 是否可以通过序列化获得新的对象?
对于问题1, 可以通过双重检查加锁解决. 这是运用单例的常识, 不再详细说明.
问题2, 3, 4则是很难避免的.
但是我们可以通过java提供的一种简单的方式创建一个真正的singleton类: 仅有 ...
[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
clone用在什么场合下
1. 创建一个新的对象需要很复杂的步骤(例如类的继承层次很深), 而刚好有一个适合的对象用来clone,
这时使用clone技术有助于性能优化;
2. ...
[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
所谓的started service, 是我对以startService()方法启动的service的叫法. Service运行在所在进程的main thread中. 启动一个service时, 不会自动为该service创建新的thread. 这意味着开发者通常需要为service开启新的线程, 以执行耗时或者阻塞操作—否则可能导致ANR错误的发生. 既然如此, 为何不在activity中直接开启新的线程执行耗时操作或者阻塞操作呢? 原因在于一个包含正在运行的service的进程具有更安全的进程优先级- ...
[本文的图片来源于google SDK文档]
基本概念
task是一系列activity的集合, 这些activity通常因为同一目的而启动, 系统将这些activity按照创建的顺序组织在栈中(也就是所谓的back
stack). 每一个task都拥有一个仅属于它的back stack.
例如一个联系人app, 当新建一个联系人时, 需要为这个联系人指定头像.
这时会启动图片浏览器选择一张图片作为头像, 选择完成之后切换回联系人app. 在这个过程中, 至少会启动2个activity, 系统会将这2个activity安排在同一个task中, 给用户的感觉就好像是这2个activ ...
[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留.
但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个activity重新回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发者可以覆写onSaveInstanc ...
[这篇文章是我对dev Guide中Processes and Threads的翻译和总结, 也加上了一些个人理解]
android中的进程
默认情况下, 同一个application中的所有component运行在同一个linux进程下. 启动一个component A时, 如果已存在处于运行状态中的component B, 且A和B属于同一个application, 那么component A将在component B所在的进程下运行. 否则将为A创建一个新的linux进程.
开发者也可以为application中的component指定不同的运行进程. manifest.xm ...
[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
Intent用于启动Activity, Service, 以及BroadcastReceiver三种组件, 同时还是组件之间通信的重要媒介.
使用Intent启动组件的优势
1, Intent为组件的启动提供了一致的编程模型. 无论想要启动的组件是Activity, Service, 还是BroadcastReceiver, 都可以使用Intent封装启动的意图.
2, 在某些时候, 应用程序只是想启动具有某种特征的组件, 并不想和某个特定的组件耦合. 使用Intent可以方便的达到这种高层次解耦 ...
[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
准备工作
1. 登陆页面的表单:
<s:fielderror />
<s:form id="loginForm" name="loginForm" method="post" namespace="/validate" action="validateActi ...
[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
单文件上传
1. 通过HTML表单上传文件时, 需要将表单的enctype属性设置为multipart/form-data, method属性设置为post.
jsp页面代码:
<form action="${pageContext.request.contextPath}/upload/uploadAction_saveFile.action"
name="form1" method="post" enctype=" ...
[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
html页面中每一个表单输入项都只能是字符串或者字符串数组, 服务端可能需要把String转换为特定的数据类型.
在struts2中, 由parameters拦截器负责请求参数的类型 ...
[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
如果不采用连接池技术, 将导致不断创建和销毁数据库Connection, 造成性能上的损耗. 而数据库连接池技术将在池中创建一定数量的Connection, 当需要Connection时就从池中取出一个, 用完之后归还给连接池, 而不是将其销毁.
自定义数据库连接池的具体步骤分析:
a. 定义MyDataSource类, 实现DataSource接口, 并提供接口中定义的方法. 其中, 核心方法为Connection getConnection().
b. 可以在静态代码块或构造函数中创建多个Conn ...