首页 > 其他分享 >Day 12 synchronized和Lock的学习

Day 12 synchronized和Lock的学习

时间:2022-09-26 23:44:08浏览次数:55  
标签:同步 synchronized Lock 死锁 12 lock 方法 Day

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锁不能保护方法,不能同步方法上。整的来说,关于死锁机制和锁机制,在学习操作系统时就已了解,现在相当于回顾和加深印象。

标签:同步,synchronized,Lock,死锁,12,lock,方法,Day
From: https://www.cnblogs.com/guoyifan/p/16733002.html

相关文章

  • day02 cookie管理器
    1、添加默认请求头2、配置好http请求:get请求和路径/cookie/set,添加参数:uesr:uesername3、添加配置元件-cookie管理器4、添加结果树5、提交请求,查看结果树,get请求体里面,......
  • 已知A矩阵为: 4 20 12 8 3 15 0 40 8 22 12 36 11 30 18 46
    已知A矩阵为: 4  20 12 8 3  15  0 40 8  22 12 36 11 30 18 46 将A中元素能被3整除的,全部置0  要求输出4200......
  • 已知A矩阵为: 4 20 12 8 3 15 0 40 8 22 12 36 11 30 18 46
    已知A矩阵为: 4  20 12 8 3  15  0 40 8  22 12 36 11 30 18 46 将A中元素大于10且小于25的数找出来,并输出该值在矩阵中的坐标......
  • javascript:页面中有多处window.onload时的处理(chrome 105.0.5195.125)
    一,js代码:<html><head><metacharset="utf-8"/><title>测试</title></head><body><script>//console.log("window.onload未执行前的值:"+window.onload);......
  • 已知A为4*5的矩阵 12 3 4 7 8 5 6 9 11 13 2 1 15 20 2
    已知A为4*5的矩阵12  3  4  7  85   6  9  11 132   1  15 20 2110  6  11  8  9完成如下操作:将A(2,4)的......
  • 已知A矩阵为: 4 20 12 8 3 15 0 40 8 22 12 36 11 30 18 46 将A中
    已知A矩阵为:4  20 12 83  15  0 408  22 12 3611 30 18 46将A中元素小于等于12全部置0要求输出02000015040......
  • day06
    leetcode242.有效的字母异位词进入哈希表章节思路:首先数组本身就是一个简单的哈希表,我们可以利用一个数组来记录元素出现的次数,字母一共有26个,我们可以定义一个长度为26......
  • Jvm(day3—内存模型)
    Jvm内存模型 名称说明方法区存储:类的元信息、静态变量、常量jdk1.8之后,用元空间替换了方法区,且元空间的内存不在jvm中,而是用的本地内存。堆区存储:对象......
  • 做题记录整理dp12 P7961 [NOIP2021] 数列(2022/9/26)
    P7961[NOIP2021]数列当时在考场上对于拿部分分这个感念不是很清晰,所以当时连暴力分都没拿。。。事实上这题在看了题解之后还是有很多地方没搞明白,比如最后统计答案,为什......
  • CSP-S模拟12
    喜欢写博客的前提是得会改题……好难啊如果明天能收到生日礼物,或者一句生日快乐的话,我会非常快乐的,并且祝福你rp++ A.开挂发现改变之后的得到的结果是唯一确定的,为了......