zoukankan      html  css  js  c++  java
  • 简单 谈谈 关于 锁 的常见问题

    1.线程同步的几种方式有哪些?

    synchronized修饰 、使用Lock、使用容器类如ConcurrentHashMap 等。

    2.synchronized和java.util.concurrent.locks.Lock的 区别有哪些?

    (1)Lock必须在finally块中释放 ,否则,如果在运行受保护的代码时,抛出了异常,那么该锁将永远不能释放,会形成死锁;
    (2)synchronized 块必须完成的被包含在一个方法中,而 Lock对象 可以把 调用 lock()和 unLock()方法放在不同的方法里面;
    (3)synchronized 不能保证进入访问等待的线程的访问循序,因此无法设置 synchronized 代码块的访问等待超时时间。

    3.乐观锁和悲观锁怎么理解,如何实现?

    乐观锁,每次操作都不加锁,一般是配合数据库使用 ,会在数据库存储版本号 或者时间戳 字段,每次以此为限制条件 与数据 库的值做对比,对比相同说明抢到操作权限,每次操作时修改版本号或时间戳;
    悲观锁则每次操作都会导致其他需要锁的线程挂起,等待锁释放后才允许下一个线程使用,可使用 synchronized 或 Lock实现。

    4.Synchronized有哪些缺点?

    (1)只能有一个对象锁与锁相关联,无法多个同时使用;
    (2)使用Synchronized的线程如果正在等待获取锁时 ,将无法中断,如果是多线程竞争一个锁,那么还没有获得锁的线程将一直等待下去,也就是同步阻塞。

    5.简单说说 死锁产生的四个条件 分别是什么 ?

    (1)互斥条件:只有等待获得锁的进程释放锁,才允许下一个进程获得锁。
    (2)不可剥夺条件:如果获取锁的进程还没有释放锁,那么不能被其他进程强制剥夺,需要等其主动释放才允许下一个进程获得。
    (3)请求和保持条件:进程获得资源后,在未使用完毕之前,又申请新的资源的同时,会一直保持已经分配到的资源。
    (4)循环等待条件:在发生死锁前,必然存在一个进程等待队列,形成进程等待环路,前一个进程占有后一个进程所申请的资源。
  • 相关阅读:
    MySQL使用小记
    简单使用grunt、bower工具合并压缩js和css
    python爬虫scrapy命令工具学习之篇三
    python爬虫scrapy学习之篇二
    Maven简单的配置Junit测试及使用简单的mock
    mysql循环查询树状数据
    centos 升级python26到python27
    java基础之十一:方法重写
    java基础知识之十:final关键字
    java基础知识之九:继承
  • 原文地址:https://www.cnblogs.com/c2g5201314/p/13111113.html
Copyright © 2011-2022 走看看