博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发编程实战笔记2:对象的组合
阅读量:6936 次
发布时间:2019-06-27

本文共 1144 字,大约阅读时间需要 3 分钟。

设计线程安全的类

在设计现车让安全类的过程之中,需要包含以下三步:

  1. 找出构成对象状态的所有变量
  2. 找出约束状态变量的不变性条件
  3. 建立对象状态的并发访问策略

实例封闭

通过封闭机制与合适的加锁策略结合起来,可以确保以线程安全的方式来使用非线程安全的对象。

在Java的类库中,有些类的唯一用途就是讲非线程安全的类转化为线程安全的类。一些基本的容器类并非是线程安全的,例如ArrayList和HashMap,但是可以通过包装器工厂方法,例如Collections.synchronizedList及其类似方法,使得这些非线程安全的类可以在多线程环境中安全的使用。这些工厂方法通过装饰器模式将容器类封装在一个同步的包装器对象中。

Java监视器模式

遵循Java监视器模式的对象会把对象的所有可变状态都封装起来,并由对象自己的内置锁来保护。示例代码如下所示:

public final class Counter{    private long value=0;    public synchronized long getValue(){        return value;    }    public synchronized long increment(){        if(value==Long.MAX_VALUE)            throw new IllegalStateException("count overflow");        return ++value;    }}复制代码

在许多类中都使用了Java监视器模式,例如Vector和Hashtable。

线程安全性的委托

如果一个类是由多个独立且线程安全的状态变量组成,并且在所有的操作中都不包含无效状态转换,那么可以将线程安全性委托给底层的状态变量。

如果一个状态变量是线程安全的,并且没有任何不变性条件来约束它的值,在变量的操作上也不存在任何不允许的状态转换,那么就可以安全地发布这个变量。

委托是实现线程安全的一个最有效策略。委托就是把原来通过使用synchronized和volatile来实现线程安全,委托给Java提供的一些基础构建模块(或者自己写的基础构建模块)区实现,包括:

  • 同步容器:比如Vector,但是同步容器的原理大多就是synchronized,所以用的不多
  • 并发容器:比如ConcurrentHashMap,CopyonWriteArrayList,LinkedBlockingQueue等。
  • 同步公布类:Future,FutureTask还要闭锁(Latches),信号量(Semaphores),栅栏(Barriers)等

参考资料

  • Java并发编程实战

转载地址:http://jfbnl.baihongyu.com/

你可能感兴趣的文章
小蚂蚁学习数据结构(10)——树的基本介绍
查看>>
域环境迁移
查看>>
FastDFS安装使用实战一(安装篇)
查看>>
我的友情链接
查看>>
更改DEB包内容
查看>>
我的友情链接
查看>>
ibatis动态语句中的prepend
查看>>
keepalived实现LVS的高可用以及实现web服务的高可用(主从模型、双主模型)
查看>>
linux apache
查看>>
Mysql DBA 高级运维学习之路-删除表中数据
查看>>
4.26日第14次作业,23章项目整体绩效评估,24-32章信息安全相关知识
查看>>
新一代java模板引擎典范 Beetl
查看>>
centos6.8+nginx搭建简单的https服务器
查看>>
cut,sort,wc,uniq,tee,tr,split,并且,和,或者
查看>>
LVS负载均衡之三:LVS-DR搭建web群集、LVS结合Keepalived搭建高可用web群集
查看>>
JavaScript 堆内存分析新工具 OneHeap
查看>>
浅谈java异常机制
查看>>
Docker 监控之 SaaS 解决方案
查看>>
用struts2实现简单的登录操作
查看>>
openstack-理解cinder服务
查看>>