美文网首页
14、各种锁的理解

14、各种锁的理解

作者: i小雨 | 来源:发表于2020-11-25 14:16 被阅读0次

1、公平锁、非公平锁

  • 公平锁:非常公平,不能插队,必须先来后到。
  • 非公平锁:非常不公平,可以插队(synchronized和lock默认都是非公平锁)
//默认为非公平锁
public ReentrantLock() {
        sync = new NonfairSync();
    }

public ReentrantLock(boolean fair) {
        sync = fair ? new FairSync() : new NonfairSync();
    }

2、可重入锁

可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提锁对象得是同一个对象或者class),不会因为之前已经获取过还没释放而阻塞。Java中ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。

图片.png
Synchronized:
//测试可重入锁:synchronized
public class reentrant {

    public static void main(String[] args) {

        Phone phone = new Phone();

        new Thread(()->{
            phone.email();
        },"A").start();

        new Thread(()->{
            phone.email();
        },"B").start();

        new Thread(()->{
            phone.call();
        },"C").start();
    }
}

class Phone{

    public synchronized void email(){
        System.out.println(Thread.currentThread().getName()+"->email");
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        call(); //该方法也加了锁
    }

    public synchronized void call(){
        System.out.println(Thread.currentThread().getName()+"->call");

    }

}
******************************结果:**********************************
A->email
A->call
C->call
B->email
B->call

ReentrantLock:

//测试可重入锁:ReentrantLock
public class TestReentrantLock {
    public static void main(String[] args) {

        Phone2 phone = new Phone2();

        new Thread(()->{
            phone.email();
        },"A").start();

        new Thread(()->{
            phone.email();
        },"B").start();

        new Thread(()->{
            phone.call();
        },"C").start();
    }
}

class Phone2{

    Lock lock = new ReentrantLock();

    public synchronized void email(){
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName()+"->email");

            TimeUnit.SECONDS.sleep(2);

            call(); //该方法也加了锁
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public synchronized void call(){
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName()+"->call");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }

    }
}
***************************结果:*****************************
A->email
A->call
C->call
B->email
B->call

相关文章

  • 14、各种锁的理解

    1、公平锁、非公平锁 公平锁:非常公平,不能插队,必须先来后到。 非公平锁:非常不公平,可以插队(synchron...

  • 理解各种锁

    1.首先是CAS(Compare-and-swap) 平台相关,它有三个操作数内存位置值V,旧值A,新值B。 CA...

  • 深入理解各种锁

    1 临界区 1.1简介 在早期计算机系统中,只有一个任务进程在执行,并不存在资源的共享与竞争。随着技术和需求的飞速...

  • MySQL 各种锁理解总结

    该文章举例都是基于 InnoDB 可重复读(RR)隔离级别的,mysql 版本 8.0 根据加锁的范围,MySQL...

  • MySQL 中各种锁的理解

    我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突) 乐观锁乐观锁不是数据库自带的,需要我...

  • Mysql中各种锁的理解

    一:引言--为什么mysql提供了锁 最近看到了mysql有行锁和表锁两个概念,越想越疑惑。为什么mysql要提供...

  • 各种锁🔒

    (1)互斥锁 a.每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象...

  • 2019-03-18文章精选

    1.深入理解 MySQL ——锁、事务与并发控制 各种锁、事务与并发,写得很详细。 2.剖析分布式锁 redis部...

  • 数据库的各种锁(乐观锁,悲观锁等等各种锁)

    我们才操作数据库的时候,可能会因为并发问题一起一系列的数据不一致的问题(数据冲突)这时就需要锁了, 乐观锁 乐观锁...

  • ios之各种锁机制的使用和理解

    锁可以分为两大类:自旋锁(OSSpinLock)和互斥锁(pthread_mutex)。 相同点:都能保证同一时间...

网友评论

      本文标题:14、各种锁的理解

      本文链接:https://www.haomeiwen.com/subject/klwgiktx.html