ZOOKEEPER 八月 15, 2020

Zookeeper ZAB协议

文章字数 1.9k 阅读约需 2 mins.

Zookeeper Automic Broadcast(ZAB),即Zookeeper原子性广播,是Paxos经典实现。

  • looking:选举Leader的状态(崩溃恢复状态下)
  • following:跟随者(follower)的状态,服从Leader命令
  • leading:当前节点是Leader,负责协调工作。
  • observing:observer(观察者),不参与选举,只读节点。

崩溃恢复、消息广播

崩溃恢复

leader挂了,需要选举新的leader

a.每个server都有一张选票<myid,zxid>,如(3,9),选票投自己。

b.每个server投完自己后,再分别投...

查看全文

ZOOKEEPER 八月 15, 2020

Zookeeper ZAB协议

文章字数 1.9k 阅读约需 2 mins.

Zookeeper Automic Broadcast(ZAB),即Zookeeper原子性广播,是Paxos经典实现。

  • looking:选举Leader的状态(崩溃恢复状态下)
  • following:跟随者(follower)的状态,服从Leader命令
  • leading:当前节点是Leader,负责协调工作。
  • observing:observer(观察者),不参与选举,只读节点。

崩溃恢复、消息广播

崩溃恢复

leader挂了,需要选举新的leader

a.每个server都有一张选票<...

查看全文

五月 28, 2020

并发编程之公平、非公平锁

文章字数 1.2k 阅读约需 1 mins.

公平锁是指多个线程按照申请锁的顺序来获取锁,线程直接进入队列中排队,队列中的第一个线程才能获得锁。公平锁的优点是等待锁的线程不会饿死。缺点是整体吞吐效率相对非公平锁要低,等待队列中除第一个线程以外的所有线程都会阻塞,CPU唤醒阻塞线程的开销比非公平锁大。

如上图所示,只有拿到锁的人才能够打水,每个过来打水的人都要管理员的允许并拿到锁之后才能去打水,如果前面有人正在打水,那么这个想要打水的人就必须排队。管理员会查看下一个要去打水的人是不是队伍里排最前面的人,如果是的话,才会给你锁让你去打水;如果...

查看全文

五月 15, 2020

并发编程之Synchronized锁

文章字数 3.1k 阅读约需 3 mins.

synchronized是悲观锁,在操作同步资源之前需要给同步资源先加锁,这把锁就是存在Java对象头里的,Hotspot的对象头主要包括两部分数据:Mark Word(标记字段)、Klass Pointer(类型指针)。

  • Mark Word:默认存储对象的HashCode,分代年龄和锁标志位信息。这些信息都是与对象自身定义无关的数据,所以Mark Word被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。它会根据对象的状态复用自己的存储空间,也就是说在运行期间Mark Word...

查看全文

四月 10, 2020

并发编程之自旋锁

文章字数 1.6k 阅读约需 1 mins.

阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态转换需要耗费处理器时间。在许多场景中,同步资源的锁定时间很短,为了这一小段时间去切换线程,线程挂起和恢复现场的花费可能会让系统得不偿失。如果物理机器有多个处理器,能够让两个或以上的线程同时并行执行,我们就可以让后面那个请求锁的线程不放弃CPU的执行时间,看看持有锁的线程是否很快就会释放锁。

而为了让当前线程“稍等一下”,我们需让当前线程进行自旋,如果在自旋完成后前面锁定同步资源的线程已经释放了锁,那么当前线程就可以不必阻塞而是直...

查看全文

三月 21, 2020

并发编程之乐观锁、悲观锁

文章字数 1.8k 阅读约需 2 mins.

Java中,synchronized关键字和Lock的实现类都是悲观锁。

而乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则根据不同的实现方式执行不同的操作(例如报错或者自动重试)。

乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的。

根据从上面的概念描述我们可以...

查看全文

并发 三月 08, 2020

并发编程之volatile

文章字数 1.6k 阅读约需 1 mins.

我们首先来看看在多线程下处理共享变量时Java的内存模型:

Java内存模型规定,将所有的变量都存放在主内存中,当线程使用变量时,会把主内存里面的变量复制到自己的工作空间或者叫作工作内存,线程读写变量时操作的是自己工作内存中的变量。

synchronized块是Java提供的一种原子性内置锁,线程的执行代码在进入synchronized代码块前会自动获取内部锁,这时候其他线程访问该同步代码块时会被阻塞挂起。拿到内部锁的线程会在正常退出同步代码块或者抛出异常后或者在同步块内调用了该内置锁资源的wait...

查看全文

并发 二月 15, 2020

并发编程之Happens-Before原则

文章字数 1.6k 阅读约需 1 mins.

JVM定义的Happens-Before原则是一组偏序关系:对于两个操作A和B,这两个操作可以在不同的线程中执行。如果A Happens-Before B,那么可以保证,当A操作执行完后,A操作的执行结果对B操作是可见的。
Happens-Before的规则包括:

  • 程序顺序规则
  • 锁定规则
  • volatile变量规则
  • 线程启动规则
  • 线程结束规则
  • 中断规则
  • 终结器规则
  • 传递性规则

程序顺序规则

在一个线程内部,按照程序代码的书写顺序,书写在前面的代码操作Happens-Before书写在后面的代码操作...

查看全文

SPRING 一月 28, 2020

Spring之循环依赖的解决方案

文章字数 7.9k 阅读约需 7 mins.

循环依赖就是循环引用,就是两个或者多个 bean 相互之间的持有对方,最后形成一个环。例如 A 引用了 B,B 引用了 C,C 引用了 A。

原型(Prototype)的场景是不支持循环依赖的,通常会走到AbstractBeanFactory类中下面的判断,抛出异常。通过构造器注入的循环依赖,也是无法解决的。

对于 setter 注入造成的依赖可以通过 Spring 容器提前暴露刚完成构造器注入但未完成其他步骤(如 setter 注入)的 bean 来完成。

Bean创建的几个关键点

Spring...

查看全文

源码 一月 20, 2020

并发编程之ThreadLocal解读

文章字数 5.6k 阅读约需 5 mins.

ThreadLocal实例的弱引用对象会作为key存放在ThreadLocalMap中,然后set方法加入的值就作为ThreadLocalMap中的value。它提供了线程本地变量,可以保证访问到的变量属于当前线程。

private final int threadLocalHashCode = nextHashCode();

//用于计算threadLocal的hash值,每个对象一直递增
private static AtomicInteger nextHashCode =
    new AtomicInteger...
查看全文

源码 十二月 15, 2019

源码系列-ConcurrentHashMap源码

文章字数 17k 阅读约需 15 mins.

JDK1.8 的实现摒弃了Segment的概念,直接用Node数组 + 链表 + 红黑树的数据结构来实现,并发控制使用SynchronizedCAS来操作,

用来控制table的初始化和扩容的操作,不同的值有不同的含义。

  • table未初始化时:sizeCtl = 0或者 sizeCtl= capacity;
  • table正在初始化:sizeCtl = -1;
  • table初始化完成:sizeCtl = thresold;
  • 当sizeCtl = − (1 + N),表明正在有N条线程正在进行resize...
查看全文
加载更多
0%