<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[codershamo的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/codershamo</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; codershamo]]></copyright><item><title><![CDATA[浅谈Java并发编程系列（七） ——— 深入解析synchronized关键字]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/52071996</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/52071996</guid><author>codershamo</author><pubDate>Sat, 30 Jul 2016 11:54:29 +0800</pubDate><description><![CDATA[Synchronized关键字synchronized的锁机制的主要优势是Java语言内置的锁机制，因此，JVM可以自由的优化而不影响已存在的代码。任何对象都拥有对象头这一数据结构来支持锁，但是对于较大的对象系统开销会更大一些。java中的每一个对象都至少包含2个字（2*4 Bytes for 32bits & 2*8 Bytes for 64bits, 不包括已压缩的对象）。第一个字被称为Mark]]></description><category></category></item><item><title><![CDATA[mybatis自定义typeHandler映射对象为JSON]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/52047862</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/52047862</guid><author>codershamo</author><pubDate>Wed, 27 Jul 2016 17:48:41 +0800</pubDate><description><![CDATA[技术背景： 
一个domain对象不可避免的会出现List、Map类型的字段，或者将多个字段拼装到一个字段的情况。

前者存在是业务及设计的需求，后者出现是当初设计数据库没有考虑那么多字段，业务快速发展时需要增加字段，数据库数据量大时，添加一个字段非常耗时，有可能中断服务。为保证服务的可用性，及减少数据订正麻烦，应对频繁的业务变更，会把几个字段拼接到一个字段中。

 这些字段在domai]]></description><category></category></item><item><title><![CDATA[AbstractQueuedSynchronizer框架]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/52028484</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/52028484</guid><author>codershamo</author><pubDate>Mon, 25 Jul 2016 22:00:37 +0800</pubDate><description><![CDATA[常开发中，大多数程序员并不会直接接触AbstractQueuedSynchronizer(AQS)类，但其在并发工具中缺无处不在，并作为内部的标准同步器，如ReentrantLock，Semaphore，Java线程池中的Worker等。本文将介绍AQS相关的实现细节。


什么是AbstractQueuedSynchronizer(AQS)

AQS负责管理同步器类中的状态，它管理了一]]></description><category></category></item><item><title><![CDATA[不使用构造方法创建Java对象： objenesis的基本使用方法]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/52015206</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/52015206</guid><author>codershamo</author><pubDate>Sun, 24 Jul 2016 17:50:02 +0800</pubDate><description><![CDATA[objenesis简介：objenesis是一个小型java类库用来实例化一个特定class的对象。使用场合：Java已经支持使用Class.newInstance()动态实例化类的实例。但是类必须拥有一个合适的构造器。有很多场景下不能使用这种方式实例化类，比如：
构造器需要参数
构造器有side effects
构造器会抛异常
因此，在类库中经常会有类必须拥有一个默认构造器的限制。Objenesi]]></description><category></category></item><item><title><![CDATA[三种深度拷贝方式的比较]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/52015192</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/52015192</guid><author>codershamo</author><pubDate>Sun, 24 Jul 2016 17:47:00 +0800</pubDate><description><![CDATA[对于深度拷贝，常见有主要有三种方式。通过序列化和反序列化，通过json转换，以及手动赋值，下面对这三种方式进行简单的比较。 
用来拷贝测试的对象如下：class User implements Serializable{
    private String name;
    private String pwd;
    private int age;    public User() {]]></description><category></category></item><item><title><![CDATA[高性能MySQL-Schema与数据类型优化]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/52014212</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/52014212</guid><author>codershamo</author><pubDate>Sun, 24 Jul 2016 15:32:42 +0800</pubDate><description><![CDATA[良好的逻辑设计和物理设计是高性能的基石，应该根据系统将要执行的查询语句设计schema，但记住这往往需要权衡各种因素。例如，反范式的设计可以加快某些类型的查询，但同时也可能使一些查询变慢。比如添加计数表和汇总表是很好的优化查询的方式，但这些表的维护成本很高。

==================================================================]]></description><category></category></item><item><title><![CDATA[使用阻塞式队列处理大数据]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/51999925</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/51999925</guid><author>codershamo</author><pubDate>Fri, 22 Jul 2016 22:37:52 +0800</pubDate><description><![CDATA[转自：http://blog.youkuaiyun.com/lifetragedy/article/details/50593588


前言
我们都知道，JAVA对于文本文件在读时是独占的，即使可以用多线程去读也涉及到一个POS（定位读）的问题，这在设计框架上会带来许多的复杂性，同时也带来代码上的不可维护性以及会经常出一些千奇百怪的错误（多线程程序由其如此）。



传统阻塞式做法的敝病
]]></description><category></category></item><item><title><![CDATA[fastjson的基本使用方法]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/51994720</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/51994720</guid><author>codershamo</author><pubDate>Fri, 22 Jul 2016 14:42:56 +0800</pubDate><description><![CDATA[1 fastjson主要的APIfastjson入口类是com.alibaba.fastjson.JSON, 主要API是JSON.toJSONString和parseObject，使用fastjson要注意要转换的类必须有默认的无参构造方法。
序列化: 
String jsonString = JSON.toJSONString(obj);
反序列化: 
VO vo = JSON.parseObj]]></description><category></category></item><item><title><![CDATA[Redis内存使用优化与存储]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/51992814</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/51992814</guid><author>codershamo</author><pubDate>Fri, 22 Jul 2016 11:02:19 +0800</pubDate><description><![CDATA[Redis常用数据类型

Redis最为常用的数据类型主要有以下五种：


String
Hash
List
Set
Sorted set

在具体描述这几种数据类型之前，我们先通过一张图了解下Redis内部内存管理中是如何描述这些不同数据类型的：





首先Redis内部使用一个redisObject对象来表示所有的key和value,redisObject]]></description><category></category></item><item><title><![CDATA[C#: Thread.Sleep(0) vs Sleep(1) vs Yeild]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/51979330</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/51979330</guid><author>codershamo</author><pubDate>Thu, 21 Jul 2016 09:11:23 +0800</pubDate><description><![CDATA[核心概念

　　优先级调度算法

　　处理器是一个操作系统执行任务的工具，线程是一个操作系统执行任务的基本单位，处理器的数量决定了不可能所有线程都能同时得到执行。这就需要通过某种算法来进行任务高度。而 Windows 是一个抢占式的多任务操作系统，我们来看下维基百科对于抢占式的定义：

In computing, preemption is the act of temporarily]]></description><category></category></item><item><title><![CDATA[Java并发编程：Callable、Future和FutureTask原理解析]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/51901057</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/51901057</guid><author>codershamo</author><pubDate>Wed, 13 Jul 2016 20:00:41 +0800</pubDate><description><![CDATA[返回结果的任务Callable与FutureExecutor框架使用Runnable作为其基本的任务表示形式。Runnable是一种有很大局限的抽象，它不能返回一个值或抛出一个受检查的异常。Runnable接口：public interface Runnable {
    public abstract void run();
}由于run()方法返回值为void类型，所以在执行完任务之后无法返回]]></description><category></category></item><item><title><![CDATA[Java并发编程：Executor框架]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/51897308</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/51897308</guid><author>codershamo</author><pubDate>Wed, 13 Jul 2016 13:43:38 +0800</pubDate><description><![CDATA[Executor接口在Java类库中，任务执行的主要抽象不是Thread，而是Executor，接口声明：public interface Executor {
    void execute(Runnable command);
}虽然Executor是个简单的接口，但它却为灵活且强大的异步任务执行框架提供了基础，该框架能支持多种不同类型的任务执行策略。它提供了一种标准的方法将任务的提交过程与执]]></description><category></category></item><item><title><![CDATA[Thread线程中start()和run()方法的区别]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/51886430</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/51886430</guid><author>codershamo</author><pubDate>Tue, 12 Jul 2016 10:01:47 +0800</pubDate><description><![CDATA[start()和run()区别
start()：用来启动一个线程， 这时此线程是处于就绪状态， 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的， 这里方法run()称为线程体， 它包含了要执行的这个线程的内容， run方法运行结束， 此线程终止， 而CPU再运行其它线程，start()不能被重复调用。 
run()： run()就和普通的成员方法一样，可以被重复调用。单独]]></description><category></category></item><item><title><![CDATA[浅谈Java并发编程系列（六） —— 线程池的使用]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/51884043</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/51884043</guid><author>codershamo</author><pubDate>Mon, 11 Jul 2016 21:13:43 +0800</pubDate><description><![CDATA[线程池的作用
降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的资源浪费。
提高响应速度。当任务到达时，不需要等到线程创建就能立即执行。
方便管理线程。线程是稀缺资源，如果无限制地创建，不仅会消耗系统资源，还会降低系统的稳定性，使用线程池可以对线程进行统一的分配，优化及监控。
设置线程池大小设置线程池的大小可以从以下几个方面分析入手：
系统中有多少个cpu？
多大的内存？
任务是计算密集]]></description><category></category></item><item><title><![CDATA[浅谈Java并发编程系列（五）—— ReentrantLock VS synchronized]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/51842582</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/51842582</guid><author>codershamo</author><pubDate>Wed, 06 Jul 2016 21:43:24 +0800</pubDate><description><![CDATA[ReentrantLock是Java并发包中一个非常有用的组件，一些并发集合类也是用ReentrantLock实现，包括ConcurrentHashMap。ReentrantLock具有三个特性：等待可中断、可实现公平锁、以及锁可以绑定多个条件。Java中的ReentrantLockReentrantLock与synchronized关键字一样，属于互斥锁，synchronized中的锁是非公平的（]]></description><category></category></item><item><title><![CDATA[浅谈Java并发编程系列（四）—— 原子性、可见性与有序性]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/51834428</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/51834428</guid><author>codershamo</author><pubDate>Tue, 05 Jul 2016 20:34:57 +0800</pubDate><description><![CDATA[Java内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性这3个特征来建立的，我们来看下哪些操作实现了这3个特性。原子性（atomicity）： 由Java内存模型来直接保证原子性变量操作包括read, load, assign, use, store和write。大致可以认为基本数据类型的访问读写是具有原子性的。如果应用场景需要一个更大范围的原子性保证，Java内存模型还提供了lock和u]]></description><category></category></item><item><title><![CDATA[浅谈Java并发编程系列（三）—— volatile型变量]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/51828938</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/51828938</guid><author>codershamo</author><pubDate>Tue, 05 Jul 2016 09:48:32 +0800</pubDate><description><![CDATA[当一个变量定义为volatile之后，它具备两种特性：
保证此变量对所有线程的可见性，这里的“可见性”是指当一条线程修改了这个变量的值，新值对于其他线程来说是可以立即得知的。
禁止指令重排序优化。
让我们从Java内存模型的角度分析下volatile变量。假定T表示一个线程，V和W分别表示两个volatile变量，那么在进行read, load, use, assign, store和write时需]]></description><category></category></item><item><title><![CDATA[浅谈Java并发编程系列（二）—— Java内存模型]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/51810755</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/51810755</guid><author>codershamo</author><pubDate>Sat, 02 Jul 2016 13:25:23 +0800</pubDate><description><![CDATA[物理计算机并发问题在介绍Java内存模型之前，先简单了解下物理计算机中的并发问题。由于处理器的与存储设置的运算速度有几个数量级的差距，所以现代计算机加入一层读写速度尽可能接近处理器的高速缓存来作为内存与处理器之间的缓冲：将运算需要使用到的数据复制到缓存中，让运算能快速进行，当运算结束后再从缓存同步回内存中，这样处理器就无须等待缓慢的内存读写了。基于高速缓存的存储交互引入一个新的问题：缓存一致性。在多]]></description><category></category></item><item><title><![CDATA[浅谈Java并发编程系列（一）—— 如何保证线程安全]]></title><link>https://blog.youkuaiyun.com/codershamo/article/details/51804725</link><guid>https://blog.youkuaiyun.com/codershamo/article/details/51804725</guid><author>codershamo</author><pubDate>Fri, 01 Jul 2016 23:17:09 +0800</pubDate><description><![CDATA[线程安全类保证类线程安全的措施：
不共享线程间的变量；
设置属性变量为不可变变量；
每个共享的可变变量都使用一个确定的锁保护；
保证线程安全的思路：
通过架构设计 
通过上层的架构设计和业务分析来避免并发场景。比如需要用多线程或分布式集群统计一堆用户的相关统计值，由于用户的统计值是共享数据，因此需要保证线程安全。从业务上分析出用户之间的数据并不共享，因此可以设计一个规则来保证一个用户的计算工作和数据]]></description><category></category></item></channel></rss>