背景:

多个线程同时修改一个变量时,有概率导致两次修改其中某些次被覆盖。

例如:如下案例一个变量值为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关键字解决的更多相关文章

  1. Java多线程:线程同步与关键字synchronized

    一.同步的特性1. 不必同步类中所有的方法, 类可以同时拥有同步和非同步方法.2. 如果线程拥有同步和非同步方法, 则非同步方法可以被多个线程自由访问而不受锁的限制. 参见实验1:http://blo ...

  2. Java多线程--线程安全问题的相关研究

    在刚刚学线程的时候我们经常会碰到这么一个问题:模拟火车站售票窗口售票.代码如下: package cn.blogs.com.isole; /* 模拟火车站售票窗口售票,假设有50张余票 */ publ ...

  3. Java多线程——线程安全问题

    一.什么情况下会产生线程安全问题? 同时满足以下两个条件时: 1,多个线程在操作共享的数据.2,操作共享数据的线程代码有多条. 当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算,就会导 ...

  4. Java多线程4:synchronized关键字

    原文:http://www.cnblogs.com/skywang12345/p/3479202.html 1. synchronized原理在java中,每一个对象有且仅有一个同步锁.这也意味着,同 ...

  5. JAVA多线程之Synchronized关键字--对象锁的特点

    一,介绍 本文介绍JAVA多线程中的synchronized关键字作为对象锁的一些知识点. 所谓对象锁,就是就是synchronized 给某个对象 加锁.关于 对象锁 可参考:这篇文章 二,分析 s ...

  6. Java多线程-线程关键字(二)

    Java中和线程相关的关键字就两:volatile和synchronized. volatile以前用得较少,以后会用得更少(后面解释).它是一种非常轻量级的同步机制,它的三大特性是: 1.保证可见性 ...

  7. Java多线程4:synchronized锁机制

    脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过 ...

  8. java多线程基础(synchronize关键字)

    [toc] 基础知识 ---- 线程:进程(process)就是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元. 线程:进程中所包含的一个或多个执行单元称为线程(threa ...

  9. Java多线程5:Synchronized锁机制

    一.前言 在多线程中,有时会出现多个线程对同一个对象的变量进行并发访问的情形,如果不做正确的同步处理,那么产生的后果就是“脏读”,也就是获取到的数据其实是被修改过的. 二.引入Synchronized ...

随机推荐

  1. WebGoat8.2.2-A8不安全的反序列化

    1.概念   使用反序列化在各编程语言中略有不同,如Java.PHP.Python.Ruby.C/C++,但在关键概念上是一样的     序列化:将(内存中的)对象转化成数据格式,以便存储或传输   ...

  2. Java培训班4个月有用吗?

    很多想学Java都会经历这样一个选择,是自学还是报班?自学的话需要一步步摸索,从无到有硬啃下来,时间没保证:可如果报班的话,目前市面上五花八门的培训机构又是鱼龙混杂,并且现在越来越多的培训机构宣称&q ...

  3. 【samtools】运行报错: error while loading shared libraries:libcrypto.so.1.0.0或libncurses.so.5或libtinfow.so.5

    samtools用conda安装后,总是出现共享库缺失的报错.即便你刚安装samtools时可以用,但后面在同一环境中安装其他相关软件,有可能产生了冲突,导致库替换,因而报错. 避免这种情况,可能最好 ...

  4. [R] read.table的check.names参数防止读入数据时列名前自动加上"X."

    最近用之前写的R脚本重新跑数据时,出现了报错.经检查,才发现是数据的列名读入R时发生了变化,列名前自动加上了X.符号. read.table系列函数有一个check.names参数,默认为 TRUE ...

  5. Linux系统的开机启动顺序

    Linux系统的开机启动顺序加载BIOS–>读取MBR–>Boot Loader–>加载内核–>用户层init一句inittab文件来设定系统运行的等级(一般3或者5,3是多用 ...

  6. 39-Remove Duplicates from Sorted Array

    Remove Duplicates from Sorted Array My Submissions QuestionEditorial Solution Total Accepted: 127836 ...

  7. 通用的js异步ajax文件上传函数

    无需表单,直接加点击事件即可, caseimg为input表单,image为图片显示 function upimage() { $('#form-upload').remove(); $('body' ...

  8. 【原创】基于RPA的软件功能自动化测试

    简介:1个功能自动化的框架 特点:OCR识别文字内容,pylackey对比图像相似度 代码极简 适用于绝大部分场景 只需要对按钮进行截图 配合第三方库可以生成漂亮的测试报告 文件结构:action-- ...

  9. 学习java的第五天

    一.今日收获 1.java程序设计完全手册第一章节的小总结 2.完成了部分例题验证解答. 二.今日难题 1.java语言与c++语言的不同点. 2.有例题验证不出来 三.明日目标 1.复习java程序 ...

  10. accurate, accuse

    accurate accurate(不是acute)和precise是近义词,precise里有个pre,又和excise(切除, 不是exercise),concise一样有cise.Why? 准确 ...