当前位置: 首页 > news >正文

多线程(七)---多线程同步相关问题

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

多线程(七)---多线程同步相关问题

(一)同步机制

  同步:多线程情况下只保证一次只有一个线程在执行,其他线程进不来,这就是同步机制

  好处:解决了多线程的安全问题

  弊端:减低效率

(二)同步前提

  问:多线程安全问题出现后,加了同步机制依旧有问题,如何解决?

  答:问题原因,不是同一个锁导致的

同步的前提:多线程在同步必须使用同一个锁,这才是多线程的同步

错误代码

public void run(){
        while (true){
            synchronized (new Object()){ // 每个线程都使用的自己的锁,导致问题发生
                if (tickets>0){
                    System.out.println(Thread.currentThread().getName()+"------tickets:"+tickets--);
                }
            }
        }
 }

(三)同步注意点

  多线程同步要分清需要同步的代码,切记不要随意添加synchronized(obj)

(四)同步函数

1)、分析多线程是否存在安全隐患?

    1.线程中是否有共享数据。

    2.是否有多条线程操作共享数据。

2)、同步函数:其实就是在函数上加上了同步关键字进行修饰

3)、同步的表现形式有两种:1.同步代码块 2.同步函数

(五)同步函数使用的锁是什么呢?函数需要被对象调用,那个对象不确定,但是都用this来表示

同步函数使用的锁就是this.

验证同步函数使用的是this。验证需求:启动两个线程。

  1:一个线程负责执行同步代码块(使用明锁)

  2:一个线程负责执行同步函数(使用this)

两个线程执行相同线程任务,如果他们没有相同的锁,说明他们没有同步,会出现数据错误

错误代码演示:

代码演示代码演示错误结果

正确代码演示:

代码演示

(六)验证statci同步函数锁是类名.class

如果同步函数被static修饰呢?

1、static随着类的加载,这时不一定有该类的对象,但是,一定有该类的字节码文件对象

2、这个对象简单的表现形式:类名.class

正确代码演示:

代码演示

转载于:https://my.oschina.net/u/3136594/blog/861924

相关文章:

  • java基础入门1到100的奇数求和
  • 清除Css中select的下拉箭头样式
  • android中webview携带cookie以及webview所加载网页中js调用java方法问题
  • 模拟 ZOJ 3878 Convert QWERTY to Dvorak
  • 【Java每日一题】20170322
  • JavaScript中的对象复制(Object Clone)
  • C#后台传入数据JS接收
  • petstore-jdbc
  • css3 动画
  • [OS] linux常见问题汇总
  • Lua 程序设计 (Roberto,Ierusalimschy 著)
  • c3p0 连接过多导致tomcat无法启动的解决方法
  • memcache set方法 MEMCACHE_COMPRESSED
  • if(A B || C),应该如何解释满足A、B、C之间的关系
  • Web前端开发的主要职责
  • CSS 专业技巧
  • ECS应用管理最佳实践
  • Java 23种设计模式 之单例模式 7种实现方式
  • jquery cookie
  • Koa2 之文件上传下载
  • Node 版本管理
  • October CMS - 快速入门 9 Images And Galleries
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • vue 配置sass、scss全局变量
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 初探 Vue 生命周期和钩子函数
  • 分布式任务队列Celery
  • 记一次删除Git记录中的大文件的过程
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • Java总结 - String - 这篇请使劲喷我
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​插件化DPI在商用WIFI中的价值
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET中两种OCR方式对比
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [ C++ ] STL---stack与queue
  • [20190113]四校联考
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C++] cout、wcout无法正常输出中文字符问题的深入调查(1):各种编译器测试
  • [EFI]Atermiter X99 Turbo D4 E5-2630v3电脑 Hackintosh 黑苹果efi引导文件
  • [Firefly-Linux] RK3568 pca9555芯片驱动详解
  • [JMS 3] ActiveMQ实现简单的helloworld
  • [MySQL光速入门]003 留点作业...
  • [node] Node.js 缓冲区Buffer
  • [NOIP2013]华容道
  • [one_demo_1]php中的文件锁
  • [UML]UML系列——类图class的实现关系Realization