java 多线程:线程安全问题synchronized关键字解决
背景:
多个线程同时修改一个变量时,有概率导致两次修改其中某些次被覆盖。
例如:如下案例一个变量值为3,三个线程同时对其-1,如果按顺序执行,每次减完的结果应该是2,1,0。但实际运行中有可能变为0,0,0 ;0 1 1 等情况
/**
* @ClassName VarNotSafe
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/20.
*/
public class VarNotSafe {
public static int num = 3; public static void main(String[] args) {
Runnable r = () -> {
num--;
System.out.println(Thread.currentThread().getName() + "结果==>:" + num);
};
Thread t1 = new Thread(r,"t1");
Thread t2 = new Thread(r,"t2");
Thread t3 = new Thread(r,"t3");
t1.start();
t2.start();
t3.start();
}
}



000实例原因:三个线程分别都做了num--环节就把执行权让出给下一个线程了。结果三个线程都把前半部分做完才执行System.out.println。导致000
变量被同时使用测试代码2:
例如数字10000, 10个线程每个线程循环1000次减去1,最终结果为零。但是并发执行覆盖可能导致未减为0

/**
* @ClassName VarNotSafe2
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/20.
*/
public class VarNotSafe2 {
private static int num = 10000;
private static class MinusNumRannable implements Runnable{
@Override
public void run() {
for(int i=0; i<1000; i++){
num--;
}
System.out.println(Thread.currentThread().getName() + "计算结果:" + num);
}
} public static void main(String[] args) {
Runnable runnable = new MinusNumRannable();
for(int i=0; i<10; i++){
new Thread(runnable).start();
}
try {
Thread.sleep(3000);
System.out.println("最终结果:" + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
VarNotSafe2

synchronized关键字解决
/**
* @ClassName VarNotSafe
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/20.
*/
public class VarSafeSynchronized {
public static int num = 3; public static class SafeThread implements Runnable { @Override
public synchronized void run() {
num--;
System.out.println(Thread.currentThread().getName() + "结果==>:" + num);
}
}
public static void main(String[] args) {
Runnable safeR = new SafeThread();
Thread t1 = new Thread(safeR,"t1");
Thread t2 = new Thread(safeR,"t2");
Thread t3 = new Thread(safeR,"t3");
t1.start();
t2.start();
t3.start();
}
}

java 多线程:线程安全问题synchronized关键字解决的更多相关文章
- Java多线程:线程同步与关键字synchronized
一.同步的特性1. 不必同步类中所有的方法, 类可以同时拥有同步和非同步方法.2. 如果线程拥有同步和非同步方法, 则非同步方法可以被多个线程自由访问而不受锁的限制. 参见实验1:http://blo ...
- Java多线程--线程安全问题的相关研究
在刚刚学线程的时候我们经常会碰到这么一个问题:模拟火车站售票窗口售票.代码如下: package cn.blogs.com.isole; /* 模拟火车站售票窗口售票,假设有50张余票 */ publ ...
- Java多线程——线程安全问题
一.什么情况下会产生线程安全问题? 同时满足以下两个条件时: 1,多个线程在操作共享的数据.2,操作共享数据的线程代码有多条. 当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算,就会导 ...
- Java多线程4:synchronized关键字
原文:http://www.cnblogs.com/skywang12345/p/3479202.html 1. synchronized原理在java中,每一个对象有且仅有一个同步锁.这也意味着,同 ...
- JAVA多线程之Synchronized关键字--对象锁的特点
一,介绍 本文介绍JAVA多线程中的synchronized关键字作为对象锁的一些知识点. 所谓对象锁,就是就是synchronized 给某个对象 加锁.关于 对象锁 可参考:这篇文章 二,分析 s ...
- Java多线程-线程关键字(二)
Java中和线程相关的关键字就两:volatile和synchronized. volatile以前用得较少,以后会用得更少(后面解释).它是一种非常轻量级的同步机制,它的三大特性是: 1.保证可见性 ...
- Java多线程4:synchronized锁机制
脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过 ...
- java多线程基础(synchronize关键字)
[toc] 基础知识 ---- 线程:进程(process)就是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元. 线程:进程中所包含的一个或多个执行单元称为线程(threa ...
- Java多线程5:Synchronized锁机制
一.前言 在多线程中,有时会出现多个线程对同一个对象的变量进行并发访问的情形,如果不做正确的同步处理,那么产生的后果就是“脏读”,也就是获取到的数据其实是被修改过的. 二.引入Synchronized ...
随机推荐
- es基本概念
电商实时数据分析平台需要学些什么? [运营指标,流量指标,销售转化指标,客户价值指标,商品指标,营销指标,风险控制指标,市场竞争指标]等电商指标数据. 检索,数据更新,排序,分词,query等缓存机 ...
- jenkins cron
1. Jenkins cron syntax Jenkins Cron 语法遵循Cron实用程序的语法(略有不同)具体来说,每行包含由TAB或SPACE分隔的5个字段(分时日月周): 分钟(Minut ...
- [SQL]master..sysprocesses
--https://docs.microsoft.com/zh-cn/sql/relational-databases/system-compatibility-views/sys-sysproces ...
- Codeforces 1500D - Tiles for Bathroom(贪心+队列)
Codeforces 题面传送门 & 洛谷题面传送门 首先先讲一发我的 \(n^2q\log n\) 的做法,虽然没有付诸实现并且我也深知它常数巨大过不去,但是我还是决定讲一讲(大雾 考虑设 ...
- FMT 和 子集卷积
FMT 和 子集卷积 FMT 给定数列 $ a_{0\dots 2^{k}-1} $ 求 $ b $ 满足 $ b_{s} = \sum_{i\in s} a_i $ 实现方法很简单, for( i ...
- 【基因组组装】HiC挂载软件以及如何用Juice_box手工纠错?
目录 1.常用HiC挂载软件 2. Juice_box手工纠错 1.常用HiC挂载软件 ALLHiC 张兴坦老师专为多倍体和高杂合度物种基因组挂载开发.如果是复杂基因组,肯定是首选.对于简单基因组,我 ...
- R包MetaboAnalystR安装指南(Linux环境非root)
前言 这是代谢组学数据分析的一个R包,包括用于代谢组学数据分析.可视化和功能注释等众多功能.最近有同事在集群中搭建蛋白和代谢流程,安装这个包出现了问题,于是我折腾了一上午. 这个包的介绍在:https ...
- PPT插件——iSlide全功能解析
做幻灯展示是我们日常工作中不可缺少的一部分,有的人喜欢用代码如Latex, markdown+pandoc+revealjs 或 bookdown.这些都是自动化做幻灯的好工具.我也都有过体会,确实简 ...
- 半主机模式和_MICROLIB 库
半主机是这么一种机制,它使得在ARM目标上跑的代码,如果主机电脑运行了调试器,那么该代码可以使用该主机电脑的输入输出设备. 这点非常重要,因为开发初期,可能开发者根本不知道该 ARM 器件上有什么 ...
- 4G网络 LTE、 FDD 和TD网络格式区别
1.LTE是long term evolution的缩写,即长期演进计划,是3GPP组织推出的移动通信3G技术向4G过渡的中间标准,并不是真正意义上的4G通信. 2.FDD是移动通信系统中使用的全双工 ...