Java多线程6-无状态对象

状态变量:实例变量、静态变量

如果一个类的同一个实例被多个线程共享并不会使这些线程存在共享状态,那么这个类及其任意一个实例就被称为无状态对象;反之,如果一个类的同一个实例被多个线程共享,会使这些线程存在共享状态,那么这个类及其任意一个实例就被称为有状态对象

无状态对象不包含任何实例变量,且不包含任何静态变量或者其包含的静态变量都是只读的(常量)

有状态对象分为:状态可变对象、状态不可变对象

无状态对象具有固有的线程安全性,它可以被多个线程共享,而这些线程在执行该对象的任何方法时都无须使用同步机制

即使一个类不包含任何实例变量或者静态变量,执行该类方法的多个线程也仍然可能存在共享状态;因为类方法中可能存在的实例对象中包含有静态变量或实例变量。此时就需要在方法中加锁来保障

托管类:实例的创建、初始化以及销毁的整个生命周期完全由别人控制

不可变对象:一经创建其状态就保持不变的对象,其具有固有的线程安全性,所以也可以像无状态对象那样被多个线程共享

一个严格意义上的不可变对象要同时满足以下所有条件:

a、类本身使用final来修饰:为防止通过创建子类来改变其定义的行为

b、所有字段都是用final修饰:被修饰的字段值不可变,保证初始化安全,对其他线程可见时,它必定是初始化完成的

c、对象在此初始化过程中没有逸出(Escape):防止其他类(如该类的内部匿名类)在对象初始化过程中修改其状态

d、任何字段,若引用了其他状态可变的对象(集合、数组等),则这些字段必须是private修饰的,若有相关方法要返回这些字段值,则应该进行防御性复制

线程特有对象

一个实例只能被一个线程访问的对象就被称为线程特有对象,相应的线程就被称为特有对象的持有线程 

优点:保障对非线程安全对象的访问的线程安全,又避免了锁的开销,有利于减少对象的创建次数

ThreadLocal相当于线程访问其线程特有对象的代理,即各个线程通过这个对象可以创建并访问各自线程特有对象,T指定了相应线程特有对象的类型

其多个线程间与ThreadLocal实例间的访问关系:

ThreadLocal有四个常用方法:get()、set(T value)、initialValue()、remove()InitialValue()方法的返回值成为当前线程的线程特有对象ThreadLocal实现线程安全示例代码:public class ThreadManager extends HttpServlet{final static ThreadLocalSDF = new ThreadLocal(){

@Override

protected SimpleDateFormat initialValue(){

return new SimpleDateFormat("yyyy-MM-dd");

}

};

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

final SimpleDateFormat sdf = SDF.get();

String strExpiryDate = req.getParameter("expirtyDate");

try(PrintWriter pwr = resp.getWriter()){

sdf.parse(strExpiryDate);

} catch(ParseException e) {

e.printStackTrace();

}

}

}

线程局部变量通常是会被声明为某个类的静态变量;ThreadLocal实例通常会被作为某个类的静态字段使用

线程持有对象可能导致的问题及其规避:

a、 退化与数据错乱

b、 ThreadLocal可能内存泄露、伪内存泄露

线程与ThreadLocal、线程特有对象的引用关系

每个Thread实例内部会维护一个类似HashMap的对象:ThreadLocalMap; 每个ThreadLocalMap内部包含若干个Entry(条目,一个键Key,值Value) key是一个ThreadLocal实例,value是一个线程持有对象;Entry可被复用。

由于ThreadLocal可能导致内存泄露,伪内存泄露;需要清理Entry所属线程特有对象,通过在当前线程中调用ThreadLocal.remove()。

线程特有对象的典型应用场景

a、 需要使用非线程安全对象,但又不希望因此而引入锁

b、 使用线程安全对象,但希望避免其使用锁的开销和相关问题

c、 隐式参数传递

d、 特定于线程的单例模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361

推荐阅读更多精彩内容