对称多处理器结构,它是相对非对称多处理技术而言的、应用十分广泛的并行技术。
非一致存储访问,将CPU分为CPU模块,每个CPU模块由多个CPU组成,并且具有独立的本地内存、I/O槽口等,模块之间可以通过互联模块相互访问。
CLH是一种基于单向链表的高性能、公平的自旋锁。申请加锁的线程通过前驱节点的变量进行自旋。在前置节点解锁后,当前节点会结束自旋,并进行加锁。
public class CLHLock { private final AtomicReference<Node> tail; private final ThreadLocal<Node> myNode; private final ThreadLocal<Node> myPred; public CLHLock() { tail = new AtomicReference<>(new Node()); myNode = ThreadLocal.withInitial(() -> new Node()); myPred = ThreadLocal.withInitial(() -> null); } public void lock(){ Node node = myNode.get(); node.locked = true; Node pred = tail.getAndSet(node); myPred.set(pred); while (pred.locked){} } public void unLock(){ Node node = myNode.get(); node.locked=false; myNode.set(myPred.get()); } static class Node { volatile boolean locked = false; } } 复制代码
MSC与CLH最大的不同并不是链表是显示还是隐式,而是线程自旋的规则不同:CLH是在前 趋结点的locked域上自旋等待,而MCS是在自己的结点的locked域上自旋等待。正因为如此,它解决了CLH在NUMA系统架构中获取locked域状态内存过远的问题。
public class MCSLock { private final AtomicReference<Node> tail; private final ThreadLocal<Node> myNode; public MCSLock() { tail = new AtomicReference<>(); myNode = ThreadLocal.withInitial(() -> new Node()); } public void lock() { Node node = myNode.get(); Node pred = tail.getAndSet(node); if (pred != null) { node.locked = true; pred.next = node; while (node.locked) { } } } public void unLock() { Node node = myNode.get(); if (node.next == null) { if (tail.compareAndSet(node, null)) { return; } while (node.next == null) { } } node.next.locked = false; node.next = null; } class Node { volatile boolean locked = false; Node next = null; } public static void main(String[] args) { MCSLock lock = new MCSLock(); Runnable task = new Runnable() { private int a; @Override public void run() { lock.lock(); for (int i = 0; i < 10; i++) { a++; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(a); lock.unLock(); } }; new Thread(task).start(); new Thread(task).start(); new Thread(task).start(); new Thread(task).start(); } }
作者:李浩宇Alex
链接:
https://juejin.cn/post/6998747583623462949