java并发编程艺术笔记

2019-01-24  本文已影响0人  Herman7z

1. 并发编程遇到的挑战


多线程 减少上下文切换的方式:

避免多个线程出现死锁

public class DeadLockDemo {

    private static final Object lock1 = new Object();
    private static final Object lock2 = new Object();


    public static void main(String[] args) {
        new DeadLockDemo().deadlock();
    }


    private void deadlock() {
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock1) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    synchronized (lock2) {
                        System.out.println("thread 1 running");
                    }
                }
            }
        }, "thread==>1");
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock2) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    synchronized (lock1) {
                        System.out.println("thread 2 running");
                    }
                }
            }
        }, "thread==>2");
        thread1.start();
        thread2.start();
    }

}

2. Java并发机制的底层实现原理


Java CAS的原理:

CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当旧的预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。这其实就是一个乐观锁

synchronized 同步表现形式:

锁的类型有四种状态,由低到高:无锁状态,偏向锁,轻量级锁,重量级锁。锁的状态可以升级,但是不能降级

参考:https://www.cnblogs.com/paddix/p/5405678.html

状态之间的转换


image.png

3. Java 内存模型


Java内存模型的抽象结构

image.png

volatile 的特性

可见性:对于一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入
原子性:对任意单个volatile变量的读、写具有原子性,但是类似于volatile++这种复合操作不具备原子性

volatile 的写-读的内存语义

image.png image.png

锁的释放和获取的内存语义

上一篇 下一篇

猜你喜欢

热点阅读