流的博客

java后端开发、数据研发

redis分布式锁的应用和zookeeper分布式锁的应用

利用SETNX+EXPIRE实现分布式锁。 SETNX:如果key不存在,那么就新增一个<key,value>,如果key存在,则不做任何操作。 EXPIRE:为了防止网络拥塞,A拿到锁以后迟迟无法释放,故设置超时时间。防止B一直等待该key,A迟迟无法释放而出现死锁。...

2019-09-17 15:04:34

阅读数 5

评论数 0

从01背包问题论回溯和动态规划

1. 回溯问题 回溯就是穷举法的一种,也就是举出所有可能性。 回溯法的思路: 1.如果当前节点放入数据An满足要求,那么继续检查下一个节点是否可以加入A1-An中的其他数据 2.如果当前节点不满足要求,直接放下一个数据An+1 下面是八皇后的一种深度优先遍历实现。所有的回溯法都满足该框架。 voi...

2019-09-15 21:32:36

阅读数 11

评论数 0

java并发(十):高并发常用缓解技术

1.扩容 例如存储资源mysql无法满足高并发要求。 增加读性能:memcahe,redis,CDN缓存等。 增加写性能:habse 2.缓存 (1)本地缓存:Guava Cache Guava Cache类似于cocurrentHashMap,每个节点存储的数据达到上限使用LRU置换算法。 (...

2019-09-12 18:04:21

阅读数 19

评论数 0

java并发(九):hashmap扩容时出现循环链表(jdk1.8把头插法换成了尾插法的原因)

1.容量计算 容量的阈值=容量*加载因子 2.扩容容量 扩容的容量大小会变成原来的两倍,用位移运算来加快计算的运行速率。 3.单线程下的rehash 1.初始化长度为2,加入11时开始扩容,数组长度变为原来的两倍 2.依次加入2,9,11三个节点。 4.多线程 多线程操作rehash形成环。...

2019-09-12 15:52:11

阅读数 9

评论数 0

java并发(八):fork/jion机制

1.工作窃取算法 每个线程有一个工作队列,线程1有一个工作队列1,线程2有一个工作队列2,当线程1将队列1中的任务执行完了以后就窃取队列2中的任务去执行。 执行任务的队列从头到尾执行,窃取线程从尾部向头部执行任务。 优点:充分了用线程的执行时间,且减少了资源抢占的情况。(每个线程的资源独立) 缺点...

2019-09-12 14:07:18

阅读数 10

评论数 0

面试真题(多线程交替打印ABC,中间变化打印顺序)

1.题目 线程1只打印t1,线程2只打印t2,线程3只打印t3,控制他输出t1,t2,t3这样5遍,然后t2,t3,t1打印,最后t3,t1,t2之后一直循环。 2.思路 有关多线程的知识不明白的可以参考:https://blog.csdn.net/qq_35688140/article/cate...

2019-09-12 11:27:49

阅读数 33

评论数 0

java并发(七):同步容器和集合类并发容器(J.U.C)

1. Collections.synchronizedList 利用同步容器Collections.synchronizedList来将一个线程不安全的类转化成为一个线程安全的集合。线程同步容器都是通过sychronized方式实现的。 @Slf4j @ThreadSafe public cla...

2019-09-11 15:48:09

阅读数 10

评论数 0

java并发(六):四种引用类型和ThreadLocal

1. final关键字 2. 线程封闭 4. 四种引用类型 参考了:https://www.zhihu.com/question/37401125 强引用是使用最普遍的引用:Object o=new Object(); 特点:不会被GC 将对象的引用显示地置为null:o=null; // 帮...

2019-09-10 21:13:43

阅读数 5

评论数 0

java并发(五):安全的发布对象(多种单例模式的实现)

1. unsafePublish发布对象 unsafePublish发布对象时,其他类可能会调用其中的共有getStatus方法来改变私有成员states的值。(不安全) @NotThreadSafe @Slf4j public class UnsafePublish { private...

2019-09-10 21:02:00

阅读数 8

评论数 0

java并发(四):volitale和happen-before原则

1.valatile保证可见性 2.写屏障 写屏障保证写完前后的数据都刷新到了主存,这样主存中去读取的数据都是最新的数据(不会存在脏数据)。 3.读屏障 读屏障保证读取之前的数据是最新的数据。 4.valitale无法保证原子性 修改数据分为3步: 1.读取count 2.count++ 3...

2019-09-10 17:17:05

阅读数 7

评论数 0

synchronized作用范围(static修饰sychronized)

@Slf4j public class SychronizedExample1 { //test1方法和test2方法的作用是一样的 public void test1(int j){ synchronized (this){ for (int ...

2019-09-10 14:10:12

阅读数 10

评论数 0

java并发(三):atomic和LongAdder

1.AtomicInteger原子类 改写上一节我们使用的代码(上一节:https://blog.csdn.net/qq_35688140/article/details/100629270) 此时我们将上一节的int变成了AtomicInteger: @ThreadSafe public cla...

2019-09-09 21:36:48

阅读数 10

评论数 0

java并发(二):CountDownLatch和Semaphore

1. CountDownLatch 通过传入的num来给计数器赋初值, CountDownLatch countDownLatch = new CountDownLatch(num); 通过下面的代码来减少计数器的数值 countDownLatch.countDown(); 通过await方法...

2019-09-08 15:45:22

阅读数 7

评论数 0

java并发(一):缓存MESI协议,JMM

一、多级缓存 现代CPU已经是多核处理器居多,加上主存的速度没有CPU快,很多时候,CPU需要等待主存。多级缓存的作用就是一个高速缓存区,来缓解这种速度上的差异。 在程序执行中,主存中的数据可以放在高速缓存区中,让CPU去执行。 但是高速缓存区空间较小,它的空间远远小于主存。缓存区就变成存放常用...

2019-09-07 17:01:55

阅读数 12

评论数 0

四种常见线程池的使用

1.newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。 2.newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 3....

2019-09-05 11:29:41

阅读数 10

评论数 0

公平锁和非公平锁,可重入锁和非可重入锁,独享锁和共享锁

1.公平锁 先进入等待队列的线程先获得锁。 2.非公平锁 每次抢占锁的时候无论先后顺序,谁拿到就归谁所有。 优点: 非公平锁是多个线程加锁时直接尝试获取锁,获取不到才会到等待队列的队尾等待。但如果此时锁刚好可用,那么这个线程可以无需阻塞直接获取到锁,所以非公平锁有可能出现后申请锁的线程先获取锁的场...

2019-09-04 20:44:09

阅读数 6

评论数 0

synchronized关键字:无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁

1.简介 synchronized是一个jvm层次的关键字,可以同步某一段代码。与ReentrantLock不同,它不可被中断。 synchronized的四个演变阶段: 无锁->偏向锁->轻量级锁->重量级锁 下面是一些相关知识: Monitor Mo...

2019-09-03 21:09:11

阅读数 9

评论数 0

自旋锁和互斥锁

1.自旋锁:自旋锁会在抢不到cpu的时候一直去重试,如果我们可以保证在很短的时间就可以抢占到cpu的使用权,这种方式就可以便面我们sleep以后再启动带来的线程切换开销。 while(getLock(lock).isfail){ } 自旋锁的使用:下面这一段就是Unsafe的getAndAddI...

2019-09-03 20:40:45

阅读数 10

评论数 0

悲观锁和乐观锁

悲观锁:认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。 乐观锁:认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的...

2019-09-03 20:26:48

阅读数 11

评论数 0

List系列:Collections.synchronizedList与CopyOnWriteArrayList比较

1.Collections.synchronizedList Collections.synchronizedList可以将一个不安全的list变成安全的list。 ArrayList arrayList = new ArrayList(); List list2 = Collections.s...

2019-09-03 20:07:19

阅读数 16

评论数 0

提示
确定要删除当前文章?
取消 删除