高并发学习(二)

安全发布对象-发布与逃逸

发布对象:使一个对象能够被当前范围之外的代码所使用

对象逃逸:一种错误的发布。当一个对象还没有构造完成的,就使它被其他线程所见

安全发布对象(单例模式:列一下)

  • 在静态初始化函数中初始化一个对象引用
  • 将对象的引用保存到volatile类型或者AtomicReference对象中
  • 将对象的引用保存到某个正确构造对象的final类型域中
  • 将对象的引用保存到锁保护的域中

不可变对象

  • 对象创建之后其状态就不能修改
  • 对象所有域都是final类型
  • 对象是正确创建的(在创建期间,this引用没有逃逸)

final关键字:类、方法、变量

修饰类:不能被继承

修饰方法:1、锁定方法不能被继承类修改;2、效率

修饰变量:基本数据类型变量、引用类型变量

其他不可变对象:

Collections.unmodeifiableXXX:Collection,List,Set,Map,,,

Guava:ImmutableXXX:Collection、List、Set、Map

原文地址:https://www.cnblogs.com/nickup/p/9695386.html

时间: 2024-07-31 09:47:39

高并发学习(二)的相关文章

聊聊高并发(二十五)解析java.util.concurrent各个组件(七) 理解Semaphore

前几篇分析了一下AQS的原理和实现.这篇拿Semaphore信号量做样例看看AQS实际是怎样使用的. Semaphore表示了一种能够同一时候有多个线程进入临界区的同步器,它维护了一个状态表示可用的票据,仅仅有拿到了票据的线程尽能够进入临界区,否则就等待.直到获得释放出的票据. Semaphore经常使用在资源池中来管理资源.当状态仅仅有1个0两个值时,它退化成了一个相互排斥的同步器.类似锁. 以下来看看Semaphore的代码. 它维护了一个内部类Sync来继承AQS,定制tryXXX方法来使

聊聊高并发(二十九)解析java.util.concurrent各个组件(十一) 再看看ReentrantReadWriteLock可重入读-写锁

上一篇聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁 讲了可重入读写锁的基本情况和主要的方法,显示了如何实现的锁降级.但是下面几个问题没说清楚,这篇补充一下 1. 释放锁时的优先级问题,是让写锁先获得还是先让读锁先获得 2. 是否允许读线程插队 3. 是否允许写线程插队,因为读写锁一般用在大量读,少量写的情况,如果写线程没有优先级,那么可能造成写线程的饥饿 关于释放锁后是让写锁先获得还是让读锁先获得,

聊聊高并发(二十)解析java.util.concurrent各个组件(二) 12个原子变量相关类

这篇说说java.util.concurrent.atomic包里的类,总共12个.网上有非常多文章解析这几个类.这里挑些重点说说. 这12个类能够分为三组: 1. 普通类型的原子变量 2. 数组类型的原子变量 3. 域更新器 普通类型的原子变量的6个, 1. 当中AtomicBoolean, AtomicInteger, AtomicLong, AtomicReference分别相应boolean, int,  long, object完毕主要的原子操作 2. AtomicMarkableRe

聊聊高并发(二)结合实例说说线程封闭和背后的设计思想

高并发问题抛去架构层面的问题,落实到代码层面就是多线程的问题.多线程的问题主要是线程安全的问题(其他还有活跃性问题,性能问题等). 那什么是线程安全?下面这个定义来自<Java并发编程实战>,这本书强烈推荐,是几个Java语言的作者合写的,都是并发编程方面的大神. 线程安全指的是:当多个线程访问某个类时,这个类始终都能表现出正确的行为. 正确指的是"所见即所知",程序执行的结果和你所预想的结果一致. 理解线程安全的概念很重要,所谓线程安全问题,就是处理对象状态的问题.如果要

聊聊高并发(二十七)解析java.util.concurrent各个组件(九) 理解ReentrantLock可重入锁

这篇讲讲ReentrantLock可重入锁,JUC里提供的可重入锁是基于AQS实现的阻塞式可重入锁.这篇 聊聊高并发(十六)实现一个简单的可重入锁 模拟了可重入锁的实现.可重入锁的特点是: 1. 是互斥锁,基于AQS的互斥模式实现,也就是说同时只有一个线程进入临界区,唤醒下一个线程时也只能释放一个等待线程 2. 可重入,通过设置了一个字段exclusiveOwnerThread来标示当前获得锁的线程.获取锁操作是,如果当前线程是已经获得锁的线程,那么获取操作成功.把当前状态作为获得锁次数的计数器

高并发学习(一)

要理解java内存模型以及一些处理高并发的技术手段,理解一些主要的硬件知识是必须的. 一个主要CPU运行计算的步骤例如以下: 程序以及数据被载入到主内存 指令和数据被载入到CPU的快速缓存 CPU运行指令,把结果写到快速缓存 快速缓存中的数据写会主内存 高并发的问题: CPU多级缓存:缓存一致性,乱序执行优化 缓存一致性:eg.(i初值为1,两个线程对i进行加1操作)两个线程分别读取i的值存入各自所在的CPU的高速缓存当中,然后线程1进行加1操作,然后把i的最新值1写入到内存.此时线程2的高速缓

java高并发学习-死锁(一)

死锁发生的必要条件: 1.互斥条件 2.请求和保持条件 3.资源不剥夺条件 4.环路等待条件 多线程的最佳并发实践; 1. 使用本地变量 2.使用不可变类 3.最小化锁的作用域范围 : S = 1/(1-a+a/n)   (阿木达尔定律) 其中,a为串行计算部分所占比例,n为并行处理结点个数.这样,当a=0时,最大加速比s=n:当a=1时,最小加速比s=1:当n→∞时,极限加速比s→ 1/a,这也就是加速比的上限.例如,若串行代码占整个代码的25%,则并行处理的总体性能不可能超过4.这一公式已被

转:java高并发学习记录-死锁,活锁,饥饿

死锁 两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 为什么会产生死锁: ① 因为系统资源不足. ② 进程运行推进的顺序不合适. ③ 资源分配不当. 产生死锁的条件有四个: ① 互斥条件:所谓互斥就是进程在某一时间内独占资源. ② 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. ③ 不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺. ④ 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系. 避免

Java并发和高并发学习总结(四)- J.U.C之工具类

1.总览 CountDownLatch允许一个或多个线程等待某些操作完成 Semaphore Java版本的信号量实现 CyclicBarrier 一种辅助性的同步结构,允许多个线程等待到达某个屏障 Exchanger 在线程间交换数据的一种手段 2.CountDownLatch 当一个或多个线程需要等待其他线程完成操作时,就可以使用CountDownLatch了,当然,最简单的你也可以使用join方法 2.1.join public class JoinTest { public static