java锁

1.公平锁与非公平锁?

  公平锁:遵循FIFO(先进先出)的原则,先到的线程优先获取资源

  非公平锁:后到的线程有可能先获取到资源

  ReentrantLock,ReentrantReadWriteLock 默认构造都是非公平锁,非公平锁的优点在于吞吐量比公平锁大。synchronized也是非公平锁

2.可重入锁(又名递归锁)?

  指的是同一线程在外层函数获取锁之后,内层递归函数仍然能获取该锁。在同一线程外层方法获取锁时,进入内层方法会自动回去到锁

  ReentrantLock就是一个典型的可重入锁

3.自旋锁(spinLock)?

  尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。

4.手写一个自旋锁?

public class SpinLockDemo {
    private AtomicReference<Thread> atomicReference = new AtomicReference();
    public void lock() {
        Thread thread = Thread.currentThread();
        while (!atomicReference.compareAndSet(null, thread)) { }
        System.out.println(Thread.currentThread().getName()+"--线程invoke lock");
    }
    public void unlock() {
        Thread thread = Thread.currentThread();
        atomicReference.compareAndSet(thread, null);
        System.out.println(Thread.currentThread().getName()+"--线程释放锁");
    }
}

5.独占锁 (写锁) /共享锁 (读锁) /互斥锁?

  独占锁:该锁一次只能被一个线程获取

  共享锁:该锁可以被多个线程持有

  

上一篇:(四)多线程之 Thread 对象的其他属性或方法


下一篇:多线程