如果一个对象想要被多个线程安全的并发访问,那么这个对象必须是或线程安全的或事实不可变的或由锁来保护的。

1.java监视器模式

大多数对象都是组合对象。当从头开始构建一个类,或者将多个非线程安全的类组合为一个类时,java监视器模式是非常有用的。

遵循java监视器模式的对象会把对象的所有可变状态都封装起来,并由对象自己的内置锁来保护。比如创建姓名类,类里面只有name一个成员变量,则将name声明为private final,然后将赋值和获取方法用synchronized进行加锁即可实现线程安全。

这只是一个最简单的例子,java监视器模式实现本质上就是将可变状态都封装起来,不让外界获取,然后通过对方法加锁,实现对变量访问的同步。

2.线程安全性的委托

当类中的各个组件都已经是线程安全的时,将线程安全的对象委托给线程安全的对象去管理是实现线程安全的一种方式。

比如person类时线程安全的,在新建的类中使用ConcurrentMap对person类对象进行管理,由于两者都是线程安全的,那么该类在访问person对象时就是线程安全的。

3.在现有线程安全类中添加功能

java提供了很多现有的线程安全类,使用现有的类而不是创建类会降低工作量和开发风险。事实上现有的类能支持我们的大部分工作,但是有些时候我们需要一些新的功能,修改类的源代码去实现线程安全无疑是最方便的,但是一般情况下我们无法去修改现有类的源代码;可以自己写类去扩展现有类,然后添加新方法,但是并非所有的类都会将状态向子类公开,而且通过“扩展”的方法比直接将代码添加到类中更加脆弱。所以这里推荐使用implements对现有类进行实现,在实现类里面,将原有方法原封不动的拿过来继续用,不过需要在方法上加锁即可,然后添加我们需要新增的功能方法。

事实上,使用java监听器模式来封装现有的类,并且只要在类中拥有指向底层对象的唯一外部引用,就能确保线程安全性。

java创建线程安全的类的更多相关文章

  1. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  2. 操作系统实现线程的几种模式 和 java创建线程的3个方式

    操作系统实现线程的几种模式 和 java创建线程的3个方式  这是两个概念 在操作系统中,线程可以实现在用户模式下,也可以实现在内核模式下,也可以两者结合实现. 1.实现线程的三种方式: (1)继承t ...

  3. Java并发编程:Java创建线程的三种方式

    目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...

  4. Java创建线程的三种主要方式

    Java创建线程的主要方式 一.继承Thread类创建 通过继承Thread并且重写其run(),run方法中即线程执行任务.创建后的子类通过调用 start() 方法即可执行线程方法. 通过继承Th ...

  5. Java创建线程的四种方式

    Java创建线程的四种方式 1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run方法,run()方法的内容就是该线程执行的内容 创建Thread子类的实例,即创建了线程对象. ...

  6. 当阿里面试官问我:Java创建线程有几种方式?我就知道问题没那么简单

    这是最新的大厂面试系列,还原真实场景,提炼出知识点分享给大家. 点赞再看,养成习惯~ 微信搜索[武哥聊编程],关注这个 Java 菜鸟. 昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的 ...

  7. java创建线程的多种方式

    java创建线程的四种方式 1.继承 Thread 类 通过继承 Thread 类,并重写它的 run 方法,我们就可以创建一个线程. 首先定义一个类来继承 Thread 类,重写 run 方法. 然 ...

  8. java创建线程的四种方法

    第一种:  通过继承Thread类创建线程 第二种: 通过实现Runnable接口创建线程 这两种早已烂记于心,这里就不作过多的介绍, 主要介绍其源码 Thread类 implements Runna ...

  9. Java创建线程的细节分析

    转载:http://shmilyaw-hotmail-com.iteye.com/blog/1880902 前言 关于线程创建的问题,可以说是老生常谈了.在刚开始学习Thread的时候基本上都会接触到 ...

随机推荐

  1. KafkaMirrorMaker 的不足以及一些改进

    背景 某系统使用 Kafka 存储实时的行情数据,为了保证数据的实时性,需要在多地机房维护多个 Kafka 集群,并将行情数据同步到这些集群上. 一个常用的方案就是官方提供的 KafkaMirrorM ...

  2. Day11 python高级特性-- 迭代器 Iterator

    直接可以作用于for循环的数据类型有以下几种:   •  集合数据类型:        list.tuple.dict.set.str   •  Generator:        生成器 和 带 y ...

  3. vue第九单元(非父子通信 events 单向数据流)

    第九单元(非父子通信 events 单向数据流) #课程目标 了解非父子组件通信的原理,熟练实现非父子组件间的通信(重点) 了解单向数据流的含义,并且明白单向数据流的好处 #知识点 #1.非父子组件间 ...

  4. 为什么 HashMap 的容量大小要设置为2的N次方?

    原文链接:https://www.changxuan.top/?p=1208 前两天,我在一位同学提交中看到了下面这样的一行代码,让我很是惊讶. Map<String, String> t ...

  5. C++模板元编程----快速排序

    目录 目录 简介 实现 数据结构定义 在数组前添加一个元素 判断 分堆 合并 快速排序的实现 总结 简介 上一篇使用C++模板模板实现了一个选择排序.这一次,更进一步的,实现了一个快速排序算法.关于快 ...

  6. 自适应查询执行:在运行时提升Spark SQL执行性能

    前言 Catalyst是Spark SQL核心优化器,早期主要基于规则的优化器RBO,后期又引入基于代价进行优化的CBO.但是在这些版本中,Spark SQL执行计划一旦确定就不会改变.由于缺乏或者不 ...

  7. 关于新创公司所需的icp,网文,软著和备案的申请

    刚从一个集团离职来到了创业团队,前期是什么都没有,甚至是公司名字都不知道,哈哈.所以就有了后面的坑踩了一遍又一遍.刚开始是在霍尔果斯注册,结果办icp费了半年的时间,东找西找还没下证.又碰上新疆严查不 ...

  8. python3全局函数解析

    python的全局函数: import builtins dir(builtins) [ 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray ...

  9. UICamera 编辑器与移动设备下的Find异常

    某次出包后,在移动设备下,发现所有的UIDrag和一些UIHUD组件都失效了,看了看Editor下是正常的,后面就做了一系列检查措施来排除问题所在. 1.看了下log日志里是否有相关报错异常,结果毫无 ...

  10. SQL语句中case,when,then的用法

    用法如下bai: 复制代码 SELECT s.s_id, s.s_name, s.s_sex, CASE WHENs.s_sex='1'THEN'男' WHENs.s_sex='2'THEN'女' E ...