Day 12 synchronized和Lock的学习

Day12

多线程学习

同步方法及同步块

方法锁synchronized可以保证线程的同步。

形成原理就是队列和锁

在方法前加synchronized关键字这个方法就是同步方法,没有加就不安全。

synchronized控制对象的访问,每一个对象都有一把锁,synchronized方法必须调用该对象的锁才能执行,不然就会堵塞。

方法里面锁,很多内容都需要锁导致效率很低,可以只在修改的代码上锁就需要同步块。

synchronized默认锁的this,要锁变换的量,

同步块 synchronized(变化的量){

}

这个变化的量也叫obj,是需要增删改的对象

CopyOnWriteArrayList JUC

这个数组就是本身安全的,属于并发编程的数组,很安全不需要再加方法锁来保证安全了

是一个数组的用法。

死锁

多个线程同时对一个资源操作时,会出现导致两个或多个都在等待对方释放资源,都停止运行的情况,某一个同步块拥有两个或以上多个锁时,就可能发生死锁问题。

用static来保证只有一份资源。

这些操作系统都讲过,概念比较好理解。

产生死锁的四个必要条件

  • 互斥条件
  • 请求与保持条件
  • 不剥夺条件
  • 循环等待条件

只要破坏一个条件或多个条件就能避免死锁的发生。

Lock锁

也是JUC包下的,属于并发编程的。

可重入锁 ReentranLock 实现了Lock类

Lock类拥有了与synchronized相同的并发性和内存语义。

while (true)
{
    try {
        lock.lock();
        if (ticketnums>0)
        {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(ticketnums--);
        }
        else
        {
            break;
        }
    }finally {
        lock.unlock();
    }

synchronized和lock的对比

lock是显式锁,需要手动开启和关闭,而synchronized是隐式锁,出了作用域自动释放。

lock只有代码块锁,synchronized不仅有代码块锁还有方法锁。

使用lock锁,JVM将花费更少的时间来调度线程,性能更好,并且具有更好的拓展性。

优先使用顺序 Lock>同步代码块>同步方法

思考

学习了两种锁,一种是synchronized关键字的锁,一种是Lock类的锁,相比来说,Lock类的锁我更容易接受,是通过一个类的方法来保护程序代码块,但是Lock锁不能保护方法,不能同步方法上。整的来说,关于死锁机制和锁机制,在学习操作系统时就已了解,现在相当于回顾和加深印象。

posted @ 2022-09-26 23:33  青山隐隐丶  阅读(28)  评论(0编辑  收藏  举报