文档章节

多线程之间实现同步

jason_kiss
 jason_kiss
发布于 2017/08/23 01:12
字数 838
阅读 41
收藏 3

目标:

    1.理解线程安全?

    2.synchronized用法

    3.死锁

一、什么是线程安全问题?

        当多个线程同时共享 ,同一个全局变量或静态变量,在做写的操作时,可能会发生数据冲突问题。

  这就是线程安全问题,但是当做读的操作是不会发生数据冲突问题的。

例子:

        比如抢火车票。

1号窗口,2号窗口,同时出售第一张火车票,这样就是现成安全问题?

结论:当多个线程同时共享同一个全局变量或者静态变量,在做写的操作时可能会发生数据冲突,造成线程安全问题。

那么如何解决线程安全问题呢?

 答:使用多线程之间同步或使用锁(lock)。

什么是线程之间的同步呢?

既然能解决线程安全问题?多个线程共享同一个全局变量时可能发生数据冲突,那么是不是 同步就不能让他们发生数据冲突呢?也就是 当这个线程在使用这个全局变量的时候其他线程不能对这个全局变量进行操作,必须等他操作完成之后才能进行操作。

答:多个线程共享同一全局变量的时候,不会受到其他线程的干扰。

什么是锁?

答:锁顾名思义就是 给你这个东西上一个锁,其他人进不来。

代码演示:

①同步代码块

    什么是同步代码块?

    答:就是讲可能发生线程安全的代码,给包括起来。

    synchronized(同一个数据){

         可能会发生线程冲突问题

        }

   

这里就不会出现  上面两个线程抢同一张票的情况!

②同步函数

    什么是同步函数?

    答:方法被synchronized 修饰的方法,叫同步方法,

    

    同步我们都要定义一个锁对象,但是这个同步函数的锁对象是谁呢?

    答:this

    证明方式:一个用明锁,一个不用,看是否出现数据冲突问题。

    

③静态同步函数

        什么是静态同步函数?

        答:就是在同步函数前加一个 static 关键字,

        

       那么静态同步函数又是用的什么对象锁呢?

        注意这里静态方法都会被先加载。所以这里的锁对象是 该函数的字节码对象。

        可以通过getClass   或者 类名.class

    

总结:

    synchronized 修饰方法 是用的this 锁

    synchronized 修饰静态方法 是用的 字节码对象。

二、多线程死锁

    什么是死锁?

    两个线程各抱着自己的锁,等着对方释放锁。这就是死锁。一直等下去。。。

    什么原因造成的?

    同步中嵌套同步!

    

面试题总结:

        1.什么是线程安全问题?如何解决?

         答:当多个线程共享同一个全局变量或静态变量,可能会造成数据冲突。使用同步或者锁。

        2.如何判断会造成线程安全问题。

            答:如果这个线程有写的操作,就可能会发生线程安全问题,如果是读的操作则不会发生线程安全问题

        3.什么是死锁

            答:同步中嵌套同步

 

© 著作权归作者所有

jason_kiss
粉丝 20
博文 115
码字总数 60548
作品 0
长沙
程序员
私信 提问
Java 垃圾回收机制 和并发

Java 垃圾回收机制 并发、并行、同步、异步、多线程的区别?并发:同一时间段有几个程序都处于已经启动到运行完毕之间,并且这几个程序都在同一个处理机上运行,并发的两种关系是同步和互斥;...

miaojiangmin
2018/09/16
19
0
Java进阶之synchronized关键字详解

掌握多线程是从Java入门后需要跳过的第一大坎,使用多线程就难以避免要处理数据同步问题,在Java多线程中实现数据同步的方式有很多,其中就有通过synchronized关键词来处理的方式,比如用syn...

测试开发栈
2018/04/16
0
0
秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量

前面《秒杀多线程第四篇一个经典的多线程同步问题》提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后...

晨曦之光
2012/05/21
100
0
JAVA多线程入门

JAVA多线程概述 为什么使用多线程 进程之间不能共享内存,但线程之间共享内存很容易 系统创建进程需要为该进程重新分配系统资源,但创建线程代价小得多,因此使用多线程来实现多任务并发比多...

胡壮壮
2017/05/02
0
0
秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量

前面《秒杀多线程第四篇一个经典的多线程同步问题》提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后...

长平狐
2012/12/10
67
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
今天
8
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
今天
6
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
今天
8
0
Flutter 系列之Dart语言概述

Dart语言与其他语言究竟有什么不同呢?在已有的编程语言经验的基础上,我们该如何快速上手呢?本篇文章从编程语言中最重要的组成部分,也就是基础语法与类型变量出发,一起来学习Dart吧 一、...

過愙
今天
5
0
rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部