架构师养成记--4.volatile关键字】的更多相关文章

volatile修饰的变量可在多个线程间可见. 如下代码,在子线程运行期间主线程修改属性值并不对子线程产生影响,原因是子线程有自己独立的内存空间,其中有主内存中的变量副本. public class RunThread extends Thread{ private volatile boolean isRunning = true; private void setRunning(boolean isRunning){ this.isRunning = isRunning; } public…
一.synchronized有锁重入的特点,某个线程得到对象的锁后,再次请求此对象可以再次得到改对象的锁.如下示例,在method1中调用method2,在method2中调用method3,而method1.method2和method3都是加了synchronized关键字的. /** * synchronized的重入 * @author alienware * */ public class SyncDubbo1 { public synchronized void method1(){…
前记:redis哨兵经验之谈.哨兵做主从切换可能要花费一两秒,这一两秒可能会丢失很多数据.解决方法之一是在java代码中做控制,try catch 到 链接断开的异常就sleep 一两秒钟再continue一下,重新执行一下try中的代码:另一种解决方法就是keepalive.所以说redis 3.0 之前的版本不太好用,我们应该把重点放到redis 3.0以后的版本 ,这一版本支持集群操作. 在redis3.0以前,提供了Sentinel工具来监控各Master状态,如果master异常,则会…
一.概述 disruptor对于处理并发任务很擅长,曾有人测过,一个线程里1s内可以处理六百万个订单,性能相当感人. 这个框架的结构大概是:数据生产端 --> 缓存 --> 消费端 缓存中的数据是主动发给消费端的,而不是像一般的生产者消费者模式那样,消费端去缓存中取数据. 可以将disruptor理解为,基于事件驱动的高效队列.轻量级的JMS disruptor学习网站:http://ifeve.com/disruptor-getting-started 二.开发流程 1.建Event类(数据…
ReentrantLock 有嗅探锁定和多路分支等功能,其实就是synchronized,wait,notify的升级. this锁定当前对象不方便,于是就有了用new Object()来作为锁的解决方案,后面jdk干脆就提供了一个Lock类. 伪代码: Lock lock = new ReentrantLock();//新建一个lock Condition condition = lock.newCondition();//获取条件 method1(){ try{ lock.lock(); 代…
java.util.concurrent.CyclicBarrier 一组线程共同等待,直到达到一个公共屏障点. 举个栗子,百米赛跑中,所有运动员都要等其他运动员都准备好后才能一起跑(假如没有发令员). import java.io.IOException; import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier;…
常用方法 Executors.newFiexdPool(int nThreads);固定线程数量的线程池: Executors.newSingleThreadExecutor();单个线程的线程池: Executors.newCachedThreadPool();根据实际情况调整线程个数的线程池:每个线程空闲时间60s,过时自动回收: Executors.newScheduleThreadPool();固定数量线程池,每个线程都可显现定时器. 以上几个线程池都是由ThreadPoolExecut…
master-worker模式是一种并行计算模式,分为master进程和worker进程两个部分,master是担任总管角色,worker才是执行具体任务的地方. 总体流程应该是这样的: 具体一点,代码实现流程应该是这样的: client: import java.util.Random; public class Main { public static void main(String[] args) { Master master = new Master(new Worker(), 20…
什么是future模式呢?解释这个概念之前我们先来了解一个场景吧,财务系统的结账功能,这个功能可能是每个月用一次,在这一个月中相关的数据量已经积累得非常大,这一个功能需要调用好几个存储过程来完成.假如要调用5个存储过程,每个存储过程要执行5分钟左右,那么这5个加起来就要25分钟.现在用户要求优化,把结账功能的时间控制在10分钟之内,那么该怎么做呢?解决方案就是将5个存储过程按照业务划分成几个组,这几个组并行执行.其实也就类似ajax的异步请求,主线程可以做其他的事情,耗时的业务让子线程去完成,子…
一.ConcurrentLinkedQueue 是一个适合在高并发场景下,无锁,无界的,先进先出原则.不允许为null值,add().offer()加入元素,这两个方法没区别:pull().peek()取头元素节点,pull会删除,peek不会. 二.ArrayBlockingQueue 基于数组的阻塞队列.有缓冲.定长.没有实现读写分离.有界队列 三.LinkedBlockingQueue 基于链表的阻塞队列.有缓冲.读写分离锁(从而实现生产者和消费者操作的完全并行运行).无解队列 四.Syn…