背景:

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

例如:如下案例一个变量值为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. restTemplate的问题-feign的项目

    restTemplate的问题  1.场景描述 在使用feign的项目中,偶然的使用到了restTemplate 在普通方法调用是可以访问的,一旦使用了restTemplate,出现报错 比如: 百度 ...

  2. mybatis-批量操作数据(list对象 )

    在实际工作中老是忘记 传入的参数和数据库参数名称要一致还是与实体类型一致导致很多笑话发生. 那我还是做个记录吧! dao层: int addRemark(@Param("list" ...

  3. 【Mysql】深入理解 MVCC 多版本并发控制

    MVCC MVCC(Multi-Version Concurrency Control),即多版本并发控制.是 innodb 实现事务并发与回滚的重要功能.锁机制可以控制并发操作,但是其系统开销较大, ...

  4. 【树莓派】Python开发工控机急停设计

    背景 我们在一些工业产品中使用树莓派替代了PLC和上位机,并借助树莓派的算力将AI和机器视觉引入工业领域. 以前的产品都不存在动作机构,仅仅将结果输出到指示灯.蜂鸣器或者显示器上,没有安全隐患, 现在 ...

  5. 洛谷 P5279 - [ZJOI2019]麻将(dp 套 dp)

    洛谷题面传送门 一道 dp 套 dp 的 immortal tea 首先考虑如何判断一套牌是否已经胡牌了,考虑 \(dp\)​​​​​.我们考虑将所有牌按权值大小从大到小排成一列,那我们设 \(dp_ ...

  6. Codeforces 627E - Orchestra(双向链表,思维题)

    Codeforces 题目传送门 & 洛谷题目传送门 下设 \(n,m\) 同阶. 首先有一个傻子都会的暴力做法,枚举矩形的上.下边界 \(l,r\),考虑集合多重集 \(S=\{y|x\in ...

  7. 模仿UP主,用Python实现一个弹幕控制的直播间!

    灵感来源 之前在B站看到一个有意思的视频: [B站][亦]终极云游戏!五千人同开一辆车,复现经典群体智慧实验 大家可以看看,很有意思. up主通过代码实现了实时读取直播间里的弹幕内容,进而控制自己的电 ...

  8. 【R】clusterProfiler的GO/KEGG富集分析用法小结

    前言 关于clusterProfiler这个R包就不介绍了,网红教授宣传得很成功,功能也比较强大,主要是做GO和KEGG的功能富集及其可视化.简单总结下用法,以后用时可直接找来用. 首先考虑一个问题: ...

  9. Linux服务器I/O性能分析-1

    一.IOSTAT误区 1.1 误区-svctm Linux上的svctm是重要的I/O指标(I/O平均服务时间-单位毫秒),这个值直接反映了硬件的性能(I/O请求从SCSI层发出--->I/O完 ...

  10. Linux搭建yum仓库

    1.安装nginx 2.为nginx搭建共享目录 3.安装createrepo,创建存储库 4.客户端测试 1.安装nginx yum list |grep nginx #查看是否有可用的nginx包 ...