`
coolxing
  • 浏览: 870229 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
9a45b66b-c585-3a35-8680-2e466b75e3f8
Java Concurre...
浏览量:96008
社区版块
存档分类
最新评论
文章列表
[本文是我对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 ...
Global site tag (gtag.js) - Google Analytics