2019独角兽企业重金招聘Python工程师标准>>>

synchronized 作用于非静态方法

public class Sync implements Runnable{private static int count;public Sync() {count = 0;}public  synchronized void add() {for (int i = 0; i < 5; i++) {try {System.out.println(Thread.currentThread().getName() + " --- " + (++count));Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}@Overridepublic void run() {add();}
}

test1  :

    public void test() {Sync sync1 = new Sync();Sync sync2 = new Sync();Thread t1 = new Thread(sync1);t1.start();Thread t2 = new Thread(sync2);t2.start();try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}

由于两个线程传入了两个不同的 Sync 对象,相当于两把锁。运行结果是两个线程互相切换的;如果传入的是同一个对象,线程之间不会乱序,因为是同一把锁,会互斥等待。

以下两种写法等价:
public synchronized void method( ) {//todo}public void method( ) {synchronized (this){    //todo}
}以下两种写法也是等价的:
public static synchronized void method( ) {//todo}public void method( ) {synchronized (xxx.class){    //todo}
}

如果 Sync 类的 add 方法上面加 static 关键字,同样运行test1 的代码结果不会乱序。因为这时 Sync 类的所有对象共享一把锁。
总结:

无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;

如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。

如果加的是对象锁,每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码

除了使用 synchronized 之外, 我们还可以使用 ReentrantLock 来实现同步。 ReentrantLock 与 synchronized 相似,都具备线程重入特性,只是写法上有点区别。ReentrantLock 需要显示的声明出来,并配合(lock( ), unlock( ), try/finally 语句块来完成)。ReentrantLock 增加了一些高级功能:

  1. 等待可以中断:当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他逻辑;
  2. 公平锁: 多线程在等待一个锁的时候,可以实现按照申请锁的顺序依次获取锁;
  3. 锁可绑定多个条件: 在 synchronized 中,锁对象的 wait(), notify(), notifyAll() 方法可以实现一个隐含的条件,如果要实现多条件关联,就必须额外加锁。而 ReentrantLock 只需要调用 newCondition() 方法即可;

转载于:https://my.oschina.net/freedemon/blog/1810155

synchronized 与 ReentrantLock相关推荐

  1. 【并发编程】线程锁--Synchronized、ReentrantLock(可重入锁)

    在说锁之前,我们要明白为什么要加锁,不加锁会怎样? 在并发编程中,很容易出现线程安全问题,接下来我们看个很经典的例子--银行取钱,来看一下有关线程安全的问题. 取钱的流程可以分为一下几个步骤: 1.用 ...

  2. java 同步方式 lock_java的两种同步方式, Synchronized与ReentrantLock的区别

    java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock. 相似点: 这两种同步方式有很多相似之处,它们都是加锁 ...

  3. Java—synchronized和ReentrantLock锁详解

    关注微信公众号:CodingTechWork,一起学习进步. 1 synchronized 1.1 synchronized介绍 synchronized机制提供了对每个对象相关的隐式监视器锁,并强制 ...

  4. reentrantlock原理_分享:synchronized和ReentrantLock的实现原理知识点

    前言 通常呢,会在并发情况下,同时操作某一业务从而造成数据重复提交,业务混乱等问题,通常呢,遇到解决类似问题可采用加锁,限流等问题来解决,那么看看这篇关于java中关于锁中synchronized和R ...

  5. synchronized和ReentrantLock的5个区别!

    作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 在 Java 中,常用的锁有两种:synchronized(内置锁)和 ...

  6. synchronized,ReentrantLock、ReentrantReadWriteLock和StampedLock

    java四种上锁方式原理及适用场景区分 synchronized(monitor).ReentantLock(AQS).AtomicLong(CAS).LongAdder(XADD) 针对代码块需要同 ...

  7. synchronized和ReentrantLock区别浅析 (转载地址:http://blog.csdn.net/zmx729618/article/details/51594166)

    一.什么是sychronized sychronized是java中最基本同步互斥的手段,可以修饰代码块,方法,类. 在修饰代码块的时候需要一个reference对象作为锁的对象. 在修饰方法的时候默 ...

  8. 【Java】synchronized和ReentrantLock分析

    synchronized和ReentrantLock分析 参考: 子路老师博客:https://blog.csdn.net/java_lyvee/article/details/110996764 并 ...

  9. 【每日一题~001】谈谈synchronized与ReentrantLock的区别?

    每日一题,共同成长,见证奇迹,加油老铁 问题:谈谈synchronized与ReentrantLock的区别?思考:2分钟...答案如下:1.底层实现:1)synchronized 是JVM层面的锁, ...

  10. synchronized和ReentrantLock区别

    1.区别: 1)Lock是一个接口,synchronized是Java中的关键字,synchronized是内置的语言实现: 2)synchronized发生异常时,会自动释放线程占用的锁,故不会发生 ...

最新文章

  1. SSH:Oracle数据库基础
  2. C++ link2005 error 错误 解决方法汇总(一般重复定义,如果都是不就是 函数定义和实现没有分离)...
  3. 转:要么学习,要么走人!直面竞争的30条生存原则
  4. spring 源码_spring源码系列(一)——spring循环引用
  5. 字节月薪6万招 kubernetes 开发,看到要求我傻眼了……
  6. 高薪面试系列一.HR
  7. Laravel Conf China 2019 之 安正超
  8. python3 爬虫第三步 本文包你学会正则 不会就来锤我
  9. php扩展包安装了为啥没加载,已安装PHP扩展但未加载
  10. python乘法函数_Python中列表与元组的乘法操作示例
  11. hdu 1978 How many ways
  12. python处理excel表格-如何用python处理excel表格
  13. man exportfs(exportfs命令中文手册)
  14. quartus+modelsim仿真教程
  15. SAP那些事-理论篇-18-如何做SAP售前
  16. 图说Python菜鸟版:第18章 JSON文件解析
  17. 【20保研】华东师范大学计算机科学与软件工程学院第五届“高可信软件工程优秀大学生夏令营”活动通知...
  18. 效果图是怎么做出来的?
  19. 解决哈希冲突的方法,Hash的介绍,散列因子的介绍
  20. User requirement

热门文章

  1. MINIGUI常见错误集及解决方法
  2. 设置linux服务,Linux服务的seLinux设置
  3. python 按键精灵 离线_python,PyAutoGUI,自动操作鼠标键盘,类似按键精灵
  4. kubectl 创建pvc_k8s的持久化存储PVPVC
  5. 卸载mongodb_【数据库】mongodb数据库安装
  6. python调用shell用什么类_python脚本中调用shell命令
  7. index.html图片弹窗,原生javascript实现图片弹窗交互效果
  8. 网络计算机 用户名和密码,局域网需要用户名和密码怎么办
  9. code标签无法渲染html,【菜鸟笔记】记一次django无法正常在ie和edge浏览器渲染html页面-站长资讯中心...
  10. html超链接打开共享文件夹,教你如何访问共享文件夹