CAS及原子操作概述CAS(Compare-and-Swap),即比较并替换,是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术。CAS也是现在面试经常问的问题,本文将深入的介绍CAS的原理。
CAS与volatile
结合CAS和volatile可以实现无锁并发,适用于线程数少、多核CPU的场景下使用
volatile获取共享变量时,为了保证该变量的可见性,需要使用volatile修饰。
它可以用来修饰成员变量和静态成员变量,它可以避免线程从自己的工作缓存中查找变量的值,必须到主存中获取它的值,线程操作volatile变量都是操作主存。即一个线程对volatile变量的修改,对另一个线程可见。
CAS必须借助volatile才能读取到共享变量的最新值来实现Compare-and-Swap的效果。
特点优点:
可以保证变量操作的原子性
并发量低时,CAS效率高于synchronized
在线程对共享资源占用时间较短的情况下,使用CAS机制效率也会较高
缺点:
无法解决ABA问题
可能会消耗较高的CPU
不能保证代码块的原子性
乐观锁 ...
java
未读自定义线程池线程池的意义:
降低资源消耗,复用已创建的线程,降低开销、控制最大并发数;
隔离线程环境,可以配置独立线程池,将较慢的线程与较快的隔离开,避免相互影响;
实现任务线程队列缓冲策略和拒绝策略;
实现某些与时间相关的功能,如定时执行和周期执行等。
结构图
自定义阻塞队列
阻塞队列使用一个双端队列实现,方便进行操作
参数
任务队列 ArrayDeque
锁 ReentrantLock
生产者、消费者条件变量
最大容量 Capcity
具体实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 ...
JMMJMM内存模型
Java Memory Model
java内存模型,用来屏蔽操作系统和各种硬件的内存访问差异,以实现Java程序在各种平台下运行都能达到一致的内存访问效果
Java内存模型规定所有的变量都存储在主内存中,包括实例变量,静态变量,但是不包括局部变量和方法参数。每个线程都有自己的工作内存,线程的工作内存保存了该线程用到的变量和主内存的副本拷贝,线程对变量的操作都在工作内存中进行。线程不能直接读写主内存中的变量。
不同的线程之间也无法访问对方工作内存中的变量。线程之间变量值的传递均需要通过主内存来完成。
注意:这里所说的主存和计算硬件主存相似,但是java的这片区域是虚拟机的一部分
JMM定义了什么JMM围绕了三个特征建立起来的,分别是原子性、可见性、有序性,这三个特征是java并发的基础
原子性定义:原子性指的是一个操作是不可分割,不可中断的,一个线程在执行时不会被其他线程干扰。
123int i = 0;i++;i = i+1;
第一个操作是原子性的,基本复制语句;
第二个,多个线程会发生竞态,Check then Act 先检查后执行,i+ ...
哲学家就餐问题活跃性
因为某种原因,使得代码一直无法执行完毕,这样的现象叫做活跃性。
活跃性相关的一系列问题都可以用ReentrantLock进行解决。
死锁一个线程需要同时获得多把锁,这时就容易发生死锁。
发生死锁的必要条件
互斥条件:在一段时间内,一种资源只能被一个进程所使用。
请求和保持条件:进程已经拥有了至少一种资源,同时又去申请其他资源。因为其他资源被别的进程所使用,该进程进入阻塞状态,并且不释放自己已有的资源。
不可剥夺条件:进程对已获得的资源在未使用完成前不能被强占,只能在进程使用完后自己释放。
循环等待条件:发生死锁时,必然存在一个进程——资源的循环链。
活锁活锁出现在两个线程互相改变对方的结束条件,最后谁也无法结束。
例如:
123456789101112131415161718192021222324252627282930313233@Slf4j(topic = "LiveLock")public class LiveLockDemo { static volatile int count = 10; s ...
迭代器模式简介 迭代器模式(Iterator Pattern)是 Java 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
主要解决:不同的方式来遍历整个整合对象。
何时使用:遍历一个聚合对象。
如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。
关键代码:定义接口:hasNext, next。
应用实例:JAVA 中的 iterator。
优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
使用场景: 1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。
注意事项:迭代器模式就是分离了 ...
IOC
终于学完了设计模式,今天试着写了一下IOC容器,只是简单的模仿了一下,不喜勿喷
spring使用回顾自定义spring框架前,先回顾一下spring框架的使用,从而分析spring的核心,并对核心功能进行模拟。
数据访问层。定义UserDao接口及其子实现类
12345678910public interface UserDao { public void add();}public class UserDaoImpl implements UserDao { public void add() { System.out.println("userDaoImpl ...."); }}
业务逻辑层。定义UserService接口及其子实现类
1234567891011121314151617public interface UserService { public void add();}public class UserServiceI ...
责任链模式概述顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
何时使用:在处理消息的时候以过滤很多道。
如何解决:拦截的类都实现统一接口。
关键代码:Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。
应用实例: 1、红楼梦中的”击鼓传花”。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomc ...
命令模式概述 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
何时使用:在某些场合,比如要对行为进行”记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将”行为请求者”与”行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
如何解决:通过调用者调用接受者执行命令,顺序:调用者→命令→接受者。
关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一 ...
策略模式简介在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
结构策略模式的主要角色如下:
抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。
环境(Context)类:持有一个策略类的引用,最终给客户端调用。
示例类图
代码123public interface SaleStrategy { void strategy();}
123456public class StrategyA implements SaleStrategy{ @Override public void strategy() { System.o ...
模板方法模式介绍 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。
例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
何时使用:有一些通用的方法。
如何解决:将这些通用算法抽象出来。
关键代码:在抽象类实现,其他步骤在子类实现。
应 ...