在java中,同步锁和互斥锁英文关键字都是Synchronized,没有本质上的区别,两者都包括对资源的独占,使用起来没有区别。概念上的区别是

1:互斥是通过竞争对资源的独占使用,彼此没有什么关系,执行顺序是一个乱序,没有固定的执行顺序

2:同步是协调多个相互关联线程合作完成任务,彼此之间知道对方存在,执行顺序往往是有序的。线程通过一定的逻辑顺序占有资源,有一定的合作关系去完成任务。

由于同步锁和互斥锁在使用中没有任何区别,仅仅是因为线程的关系导致了概念上的一点点区别,所以不必深究其异同。很多教程中并没有对这两者作区分。

下面通过一个实例来掌握同步锁的原理和使用方法。先来执行一下如下没有加锁的代码:

public class LockDemo {    private int i = 0;    public void increaseI() {       // synchronized (this) {        for(int k=1;k<=10;k++) {  // 对i执行10次增1操作            i++;i--;i++;i--;i++;i--;i++;i--;i++;i--;i++;i--;i++;i--;i++;i--;i++;i--;            i++;        }        System.out.println(Thread.currentThread().getName() + "线程,i现在的值:" + i);        //}    }    public static void main(String[] args) throws InterruptedException {        LockDemo ld = new LockDemo();        int threadNum = 1000;        MyThread[] threads = new MyThread[threadNum];        for(int i=0;i

代码预期的结果为10000。实际输出结果不到10000。

没有加互斥锁

这是因为1000个线程共享了对象ld的属性i,在访问修改i的值时,可能会出现不同步的情况。

线程的同步(互斥)正是为了防止多个线程访问一个数据对象时,对数据造成的破坏:去掉第4行和第10行的注释,给increaseI()方法加锁后,各个线程对变量i的访问就是互斥的了,就不会对数据造成无法预估的结果:输出结果为预期的10000。

java 同步锁_java线程中的同步锁和互斥锁有什么区别?相关推荐

  1. 线程java买火车票_Java线程中卖火车票问题的深入讲解

    用java代码模拟卖100张火车票问题:四个售票窗口同时售票且不能卖出同一张火车票. 代码如下. package lesson; public class demo1 { public static ...

  2. wait放弃对象锁_Java线程中wait、await、sleep、yield、join用法总结

    一.wait().notify().notifyAll()用法 obj.wait()/obj.wait(long timeout)是Object中的方法,当线程调用wait()方法,当前线程释放对象锁 ...

  3. java runnable 异常_JAVA 线程中的异常捕获

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...

  4. java run 方法_java线程中的run()方法能有几个啊?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 给个例子 package test; public class Test{ public static void main(String[] args){ ...

  5. 详解各种锁:CAS、共享锁、排它锁、互斥锁、悲观锁、乐观锁、行级锁、表级锁、页级锁、死锁、JAVA对CAS的支持、ABA问题、AQS原理

    共享锁(S锁) 又称为读锁,可以查看但无法修改和删除的一种数据锁.如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排它锁.获准共享锁的事务只能读数据,不能修改数据. 共享锁下其它用 ...

  6. 线程中的同步和异步的区别

    线程中的同步和异步的区别 一.同步        所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作.是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率不 ...

  7. python中的非阻塞使用互斥锁

    锁定方法acquire可以有一个blocking参数. 如果设定blocking为True,则当前线程会堵塞,直到获取到这个锁为止(如果没有指定,那么默认为True) 如果设定blocking为Fal ...

  8. golang中关于读写锁、互斥锁的理解

    锁的概述 为了解决协程同步的问题我们使用了channel,但是GO也提供了传统的同步工具. 它们都在GO的标准库代码包sync和sync/atomic中. 下面我们看一下锁的应用. 什么是锁呢?就是某 ...

  9. java 线程 wait 一定要同步_Java 线程中调用wait为什么一定要在同步代码块中?

    展开全部 wait是让使用wait方法的对象等待,暂时先把对象锁给让出来,给其它持有该锁的对象用,其它对象用完后再636f707962616964757a686964616f3133333739623 ...

最新文章

  1. 【深入理解JVM】:类加载器与双亲委派模型
  2. 阿里云助力浙江大学信息化建设,以实时数据驱动校园智能管理
  3. python 高级编程 豆瓣_python 的一些高级编程技巧
  4. 台式计算机技术参数响应表,联想台式电脑配置推荐及参数详情【图文】
  5. NLPIR语义智能平台支持大数据个性化学习
  6. Android10 root,Android Q系统Magisk完美实现ROOT
  7. UI布局引擎Layout 之 QGraphicsLinearLayout
  8. zabbix监控memcached
  9. Knowledge-based Systems期刊投稿经历
  10. Ubuntu18.04安装搜狗输入法使用时不能输入中文
  11. Unity 灯光系统(一)
  12. DTI | Drug-target interaction | 基础知识
  13. 抖音发广告需要注意什么,三个注意事项与规范要牢记
  14. python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则
  15. 【概率题汇总】互联网公司概率面试题整理
  16. 【冰点】:重庆“高烧”不退
  17. function介绍
  18. The fourth,fifth,sixth,seventh episode of Crazily Speak English
  19. 4位数字验证码图片识别 +tensorflow+CNN
  20. 路科验证MCDF_svlab3笔记

热门文章

  1. wxWidgets 线程示例
  2. wxWidgets:wxDataObject类用法
  3. 在 WxHtmlWindow 中调用默认浏览器
  4. boost::mpl模块实现push_back相关的测试程序
  5. boost::mpl模块实现multiset相关的测试程序
  6. ITK:创建一个图像区域
  7. VTK:Qt之RenderWindowNoUiFile
  8. VTK:图片之ImageAccumulateGreyscale
  9. VTK:图表之VisualizeGraph
  10. VTK:几何对象之Tetrahedron