Java入门需要了解(多线程的线程安全-二十一)
多线程中最棘手也不容易分析的问题就是多线程处理共享数据时因为CPU在线程间随记切换而引发的各种安全问题
- 引发线程安全的原因
- 解决多线程的安全问题
- 同步函数
- 同步函数和同步代码块的区别
- 静态的同步函数(不常用)
- 死锁
引发线程安全的原因
- 多线程操作共享数据时
- 操作共享数据的代码有多条
- 加上CPU的切换,就会引发莫名其妙的安全问题
解决多线程的安全问题
- synchronized
synchronized(同步锁){
//需要被同步的代码;
}
- 将操作共享数据的多条代码进行封装,当再进行运算时,其他线程必须等待整段代码执行完毕才能进行。
- 同步的好处是解决了线程的安全问题。
- 同步的缺点是相对而言降低了效率,因为同步外的线程都会判断同步锁。
- 使用同步的前提是:多个线程使用同一个锁。如果多线程同步过程中出现问题,先从同步锁开始分析。
- 分析线程是否有安全隐患,首先要明确的是,在线程运行的代码中是否有共享数据
同步函数
- 把同步关键字作为函数的修饰符
- public synchronized void test(){}
- 同步代码块时,我们有一把同步锁
- 但是在同步函数中,这把锁是什么呢?在同步函数中,函数所使用的同步锁是this
同步函数和同步代码块的区别
- 同步函数的锁是固定的this。
- 同步代码块的锁是任意的对象。
- 但是在实际开发中,建议使用同步代码块。因为同步函数的锁是固定的this,但是同步代码块可以自己指定。
静态的同步函数(不常用)
- public static synchronized void test(){}
- 静态函数是没有所属对象的,那么此时的同步锁是什么呢?锁必须是一个对象,而此时的对象是:类名.class 即该函数所属的字节码文件对象
死锁
- 死锁常发的一种情况是,同步嵌套。这是一种非常麻烦棘手的状况,所以尽量避免嵌套锁的代码。
class DeadLock implements Runnable {private boolean flag;DeadLock(Boolean flag) {this.flag = flag;}@Overridepublic void run() {if (flag) {synchronized (Lock.LOCK_A) {System.out.println("if LOCK_A ...");synchronized (Lock.LOCK_B) {System.out.println("if LOCK_B ...");}}} else {synchronized (Lock.LOCK_B) {System.out.println("else LOCK_B ...");synchronized (Lock.LOCK_A) {System.out.println("else LOCK_A ...");}}}}
}class Lock {public static final Object LOCK_A = new Object();public static final Object LOCK_B = new Object();
}class DeadLockTest {public static void main(String[] args) {DeadLock a = new DeadLock(true);DeadLock b = new DeadLock(false);Thread t1 = new Thread(a);Thread t2 = new Thread(b);t1.start();t2.start();}
}
Java入门需要了解(多线程的线程安全-二十一)相关推荐
- 5、Java并发性和多线程-相同线程
以下内容转自http://tutorials.jenkov.com/java-concurrency/same-threading.html(使用谷歌翻译): 相同线程(同一线程)是一种并发模型,其中 ...
- java闭合数据_java多线程中线程封闭详解
线程封闭的概念 访问共享变量时,通常要使用同步,所以避免使用同步的方法就是减少共享数据的使用,这种技术就是线程封闭. 实现线程封闭的方法 1:ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的 ...
- java runnable 启动_Java多线程:线程的创建与启动
# 面试题: Java中创建线程有几种方式. 不同的创建方式有什么区别. 如何启动一个线程. # Java中创建线程的方式 JDK源码中的描述:两种 image.png 第一种是继承Thread类,重 ...
- 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池
并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...
- java 生产者消费者_Java多线程:线程间通信—生产者消费者模型
一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是, 多个线程之间如何协作呢 ? 我们看一个 ...
- 【Java并发性和多线程】线程安全及不可变性
2019独角兽企业重金招聘Python工程师标准>>> 本文为转载学习 原文链接:http://tutorials.jenkov.com/java-concurrency/threa ...
- java 阻塞 wait_Java面试基础问题之(二十一)—— 线程持有的任何对象.wait()都会使线程陷入阻塞吗...
直接上代码: 结果: 抛出了一个异常:IllegalMonitorStateException 去官方文档查看IllegalMonitorStateException类(是个Exception的子类) ...
- 多线程之注入hook钩子线程(二十一)
现在很多的软件包括MySql,Zookeeper,Kafka等都存在hook线程的校验机制,目的是校验进程是否已>经启动,防止重复启动我们的程序 Hook线程也称为钩子线程,当JVM推出的时候他 ...
- java list 从0开始_Java从零开始学二十一(集合List接口)
package com.pb.demo1; import java.util.LinkedList; import java.util.List; public class PersonLinkedL ...
最新文章
- 怎么制作营销型网站才能有效提升优化效果?
- ppt怎么加注解文字_ppt注释的使用方法
- 小程序css中设置1rpx失效
- bzoj [Scoi2016]美味
- 全球及中国天然香豆素行业竞争态势与投资份额调研报告2022版
- Bash中的shopt选项
- MySQL查询count(*)、count(1)、count(field)的区别收集
- 设计模式装饰者模式_装饰者模式如何拯救了我的一天
- CSS之Background-clip属性
- 树莓派智能小车python论文_基于树莓派循迹小车设计概述
- 哪几所大学计算机软件方面是强项,计算机软件工程专业排名靠前的大学是那几所...
- 从入门到入土:Python爬虫学习|Selenium自动化模块学习|简单入门|轻松上手|自动操作浏览器进行处理|chrome|PART01
- Julia: [1 +j] ==[1 + j] ?
- 计算机二级c语言程序设计答题流程,计算机二级C语言上机考试操作步骤及流程.doc...
- 关于DNF的多媒体包NPK文件的那些事儿(6) - IMGV4
- IP修改后自动还原(IP地址无法修改)
- UE发生GPU崩溃D3D丢失,真的跟硬件有关系。
- NVR(网络硬盘录像机)以及其他相近名词DVR、DVS、NVS
- 基于JAVA校园快递管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
- 学报格式和论文格式一样吗_学报论文发表格式有什么要求