同步方法的机制:synchronized,包括synchronized方法和synchronized块

  同步方法:public synchronized void method(int args){ }

    synchronized方法控制对象的访问,每个对象对应一把锁,每个synchronized方法都必须获得调用该方法的对象的锁才能执行,否则线程会阻塞,方法一旦执行,就独占该锁,知道该方法返回才释放锁,后面被阻塞的线程才能获得这个锁,继续执行。默认锁定对象是this

    缺陷:如果将一个功能庞大的方法申明为synchronized会很大程度上影响效率

  同步块:synchronized(Obj){ }

    Obj可以是任何对象,需要增删改查的对象是什么就放什么,但是推荐使用共享资源作为同步监视器;同步方法中无需指定同步监视器,因为同步方法的同步监视器就是this,就是这个对象本身,或者class

      执行过程:第一个线程访问,锁定同步监视器,执行其中代码;

           第二个线程访问,发现同步监视器被锁定,无法访问;

           第一个线程访问完毕,解锁同步监视器;

           第二个线程访问,发现同步监视器没有锁,锁定并访问

死锁:多个线程各自占有一些共享资源,并且相互等待其他线程占有的资源才能运行,而导致两个多个线程都在等待对方释放资源,都停止执行的情形;某一个同步块同时拥有两个以上对象的锁时,就会发生死锁问题

  死锁的必要条件:互斥条件,一个资源每次只能被一个进程使用;

          请求与保持条件,一个进程因请求资源而阻塞时,对已获得的资源保持不放;

          不剥夺条件,进程已获得的资源在未使用之前,不能强行剥夺;

          循环等待条件,若干进程之间形成一种头尾相接的循环等待资源关系

Lock(锁):从jdk5.0开始,Java提供了更强大的线程同步机制,通过显示定义同步锁对象来实现同步。同步锁使用Lock对象充当

      java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象

      ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,比较常见的是ReentrantLock,可以显式加锁、释放锁

对比:Lock是显式锁(需要手动开启和关闭锁),synchronized是隐式锁,出了作用域自动释放;

   Lock只有代码块锁,synchronized有代码块锁和方法锁;

   使用Lock锁,JVM可以花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类);

   优先使用顺序:Lock > 同步代码块(已经进入了方法体,分配了相应资源)> 同步方法(在方法体之外)

明天学习线程协作

最新文章

  1. ASP.NET 5 Beta 7 版本
  2. ASP.NET MVC5+EF6+EasyUI 后台管理系统(18)-权限管理系统-表数据
  3. IIS7.0 Appcmd 命令详解和定时重启应用池及站点的设置
  4. java 重写 重载
  5. Java HashMap实例源码分析
  6. C++中单链表的建立和操作
  7. Linux 文件系统同步
  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo
  9. .net md5
  10. MySQL数据目录更改及相关问题解决方案
  11. JAVAscript学习笔记 jsBOM 第七节 (原创) 参考js使用表
  12. 如何更改图片的背景色(PS、证件照之星)
  13. dml并行
  14. Linux 安装 Kafka
  15. Deepin debian安装Libreoffice
  16. delphi 判断端口(Port)是否被占用(转载)
  17. Tomcat修改service.xml性能调优 增加最大并发连接数
  18. iOS - push 或 pop或点击导航栏返回pop指定导航控制器
  19. 蓝桥杯模拟赛 引爆炸弹-并查集+DFS
  20. 全民Scheme(1):数字游戏

热门文章

  1. Ubuntu系统中防火墙的使用和开放端口
  2. office online在线预览服务与https的tls证书兼容问题
  3. vue路由-router
  4. 解释一下numa
  5. short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
  6. java-jdbc-all
  7. NetCore微服务实现事务一致性masstransit之saga使用
  8. C语言之标识符(知识点3)
  9. MySQL怎么用命令修改字段长度
  10. cpu指令如何读写硬盘