一、synchronized

  synchronized关键字可以用于声明方法,也可以用来声明代码块,下面分别看一下具体的场景(摘抄自《大型网站系统与Java中间件实践》)
案例一:其中foo1和foo2是SynchronizedDemo1类的两个静态方法。在不同的线程中,这两个方法的调用是互斥的,不仅是它们之间,任何两个不同线程的调用也互斥。
public class SynchronizedDemo1 {public synchronized static void foo1(){}public synchronized static void foo2(){}
}

案例二:foo3和foo4是SynchronizedDemo2的两个成员方法,在多线程环境中,调用同一个对象的foo3或者foo4是互斥的,与案例一的差别在于,这是针对于同一个对象的多线程方法调用互斥。

public class SynchronizedDemo2 {public synchronized void foo3(){}public synchronized void foo4(){}
}

案例三:synchronized后面会有一个参数,该参数就是用于同步的锁所属的对象。

public class SynchronizedDemo3 {public void foo5(){synchronized (this){}}public void foo6(){synchronized (SynchronizedDemo3.class){}}
}

在该案例中,synchronized (this)与SynchronizedDemo3中加 synchronized的成员方法是互斥的,而synchronized (SynchronizedDemo3.class)与SynchronizedDemo3中加synchronized 的静态方法是互斥的

代码块synchronized,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里释放锁只会有两种情况:
  1)获取锁的线程执行完了该代码块,然后线程释放对锁的占有;
  2)线程执行发生异常,此时JVM会让线程自动释放锁。
  
  那么如果这个获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,其他线程便只能干巴巴地等待,影响程序执行效率。
  因此就需要有一种机制可以不让等待的线程一直无期限地等待下去(比如只等待一定的时间或者能够响应中断),通过Lock就可以办到。
  再举个例子:
  当有多个线程读写文件时,读操作和写操作会发生冲突现象,写操作和写操作会发生冲突现象,但是读操作和读操作不会发生冲突现象。但是采用synchronized关键字来实现同步的话,就会导致一个问题:
  如果多个线程都只是进行读操作,所以当一个线程在进行读操作时,其他线程只能等待无法进行读操作。
  因此就需要一种机制来使得多个线程都只是进行读操作时,线程之间不会发生冲突,通过Lock就可以办到。
  另外,通过Lock可以知道线程有没有成功获取到锁。这个是synchronized无法办到的。

二、Lock

  参考http://www.cnblogs.com/dolphin0520/p/3923167.html

三、Lock和synchronized的选择

  总结来说,Lock和synchronized有以下几点不同:
  1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;
  2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;
而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
  3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
  4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
  5)Lock可以提高多个线程进行读操作的效率。
  在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。

Java多线程:synchronized关键字和Lock相关推荐

  1. Java多线程-synchronized关键字

    进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行. 一个进程中至少有一个线程 Ja ...

  2. Java的synchronized关键字:同步机制总结

    不久前用到了同步,现在回过头来对JAVA中的同步做个总结,以对前段时间工作的总结和自我技术的条理话.JAVA的synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同 ...

  3. java 死锁 内存消耗_详解Java中synchronized关键字的死锁和内存占用问题

    先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并 ...

  4. 从分布式锁角度理解Java的synchronized关键字

    分布式锁 分布式锁就以zookeeper为例,zookeeper是一个分布式系统的协调器,我们将其理解为一个文件系统,可以在zookeeper服务器中创建或删除文件夹或文件.设D为一个数据系统,不具备 ...

  5. Java多线程同步之使用Lock实现车辆入库出库管理

    Java多线程同步之使用Lock实现车辆入库出库管理 个人笔记: 实现:车库有n个车位,现在有m辆车试图进入车库,每辆车停留随机秒数后离开 首先创建一个Garage车库类,Garage有空间属性和最大 ...

  6. java线程同步以及对象锁和类锁解析(多线程synchronized关键字)

    一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...

  7. java同步锁synchronized_Java对象锁和类锁全面解析(多线程synchronized关键字)

    本文主要是将synchronized关键字用法作为例子来去解释Java中的对象锁和类锁.特别的是希望能帮大家理清一些概念. 一.synchronized关键字 synchronized关键字有如下两种 ...

  8. java中存在对多个对象加锁的情况_Java对象锁和类锁全面解析(多线程synchronized关键字)...

    最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...

  9. Java对象锁和类锁全面解析(多线程synchronized关键字)

    最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...

最新文章

  1. Hello Shell
  2. 过度加班被表彰引员工不满。官方回应:持续高强度的急行军不持久,尽快优化调整...
  3. 另一个ExcelHelper
  4. Python 官网宣布,正式发布 Python 3.8.0!
  5. 借呗利息为什么比银行信用贷款高很多?
  6. Hibernate自动提交命令强制MySQL在过多的磁盘I / O中运行
  7. Java 8 Streams API作为友好的ForkJoinPool外观
  8. tensorflow(GPU)使用
  9. 【LeetCode】【HOT】102. 二叉树的层序遍历(队列)
  10. oracle中showTime用法,ant design vue中日期选择框混合时间选择器的用法
  11. Java实现通过ssh远程连接主机并执行命令
  12. windows连接mysql程序_windows 连接mysql
  13. 【Android开发】Android 颜色透明度换算
  14. karma看fits文件软件操作汇总【第三个维度的变化】【查看某个范围的RMS值】
  15. 计算机触摸板设置方法,解决办法:四种关闭笔记本电脑触摸板的方法[图形教程]...
  16. 火力发电厂工控系统网络安全解决方案 - 对比分析
  17. python-random模块详解
  18. Matlab 填补缺失数据
  19. 计算机组成原理中主机概念,计算机组成原理概念术语
  20. JAVA中关于可变和不可变类型的理解

热门文章

  1. java cache system_Java Cache System JCS(一) 使用方法
  2. SCAPY pcap文件数据分析 python3
  3. mysql 断开的管道_ClientAbortException: java.net.SocketException: 断开的管道
  4. 机械制图手册_42条机械制图基础常识,带徒师傅必备!
  5. FPGA的LVDS电平以及LVDS25电平能在HR Bank上使用吗?
  6. ChipScope Pro内核插入器
  7. Virtex-6器件的时钟资源、混合模式时钟管理器(MMCM)
  8. koa源码阅读之koa-compose/application.js
  9. 设置NotePad++设置不打开上次关闭的文件
  10. 输入字符串中含有该字符的个数