文档章节

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

来电
 来电
发布于 2017/03/18 14:59
字数 550
阅读 5
收藏 1

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

(一)同步机制

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

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

  弊端:减低效率

(二)同步前提

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

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

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

错误代码

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

正确代码演示:

代码演示

© 著作权归作者所有

来电
粉丝 7
博文 101
码字总数 56984
作品 0
杭州
程序员
私信 提问
1、JUC系列之---线程基础

一、多线程概述 1、进程:正在进行中的程序 2、线程:就是进程中一个负责程序执行的控制单元(执行路径) 一个进程中,可以有多个执行路径,即多线程 一个进程中,至少有一个执行路径。 (多...

李李李李格尔楞
2018/05/13
19
0
Python 线程、线程通信、多线程

这是一篇学习Python 线程相关的内容,记录一下以备复习和开发使用,技术有限,如有问题欢迎指出,多谢。 一.GIL 全局解释器锁(cpython) 1.为什么会有这个锁:为了线程安全,减少python使用者...

rieuse
2018/09/18
0
0
Java多线程学习(二)synchronized关键字(2)

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
2018/04/16
0
0
秒杀多线程第十一篇 读者写者问题

与上一篇《秒杀多线程第十篇 生产者消费者问题》的生产者消费者问题一样,读者写者也是一个非常著名的同步问题。读者写者问题描述非常简单,有一个写者很多读者,多个读者可以同时读文件,但...

长平狐
2012/12/10
195
0
秒杀多线程第一篇 多线程笔试面试题汇总

系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性。系列中不但会详细讲解多线程同...

长平狐
2012/12/10
234
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
6
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
4
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部