wordpress电影bt网站/站长统计入口

wordpress电影bt网站,站长统计入口,月饼网站建设,wordpress 404页面模板在本章节中采用实例图片的方式,以一个学习者的姿态进行描述问题解决问题,更加清晰明了,以及过程中会发问的问题都会一一进行呈现 目录 线程安全演示线程不安全情况图片解释: 将上述代码进行修改【从并行转化成穿行的方式】不会出…

在本章节中采用实例+图片的方式,以一个学习者的姿态进行描述问题+解决问题,更加清晰明了,以及过程中会发问的问题都会一一进行呈现

目录

  • 线程安全
      • 演示线程不安全情况
        • 图片解释:
      • 将上述代码进行修改【从并行转化成穿行的方式】
      • 不会出现问题的可能
      • 埋坑问题
    • 总结(线程安全问题产生原因)
  • 如何解决线程安全问题
    • 1.根本原因:
    • 2.多线程同时修改一个变量
    • 3.修改操作,不是原子的
    • 注意:

线程安全

概念:一段代码在多线程并发执行的情况下,出现bug的情况(实际结果与预期结果不符合),预期结果:一般是由别人来预期,此时这种情况是“线程不安全”

演示线程不安全情况

eg:(如果我们需要计算一个20000;两个线程每个线程执行10000次看其的一个情况)

public class Test {public static int count = 0;public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()->{for (int i = 0; i < 10000; i++) {count++;}});Thread t2 = new Thread(()->{for (int i = 0; i < 10000; i++) {count++;}});t1.start();t2.start();Thread.sleep(1000);System.out.println(count);}
}

最终运行的结果为:
在这里插入图片描述

对代码进行解释:
其中
Thread t1 = new Thread(()->{
for (int i = 0; i < 10000; i++) {
count++;
}
});
对应的是3个cpu的操作:

  1. load:将内存中的count加载到寄存器上
  2. add:把寄存器中的内容进行+1;
  3. save:把寄存器当中的内容保留在内存上

所以最终会出现这样的情况

图片解释:

对上述代码的图片解释
请添加图片描述

将上述代码进行修改【从并行转化成穿行的方式】

//只需要使用join方法就可以将并行执行的方式改为串行的方式
public class Test {public static int count = 0;public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()->{for (int i = 0; i < 10000; i++) {count++;}});Thread t2 = new Thread(()->{for (int i = 0; i < 10000; i++) {count++;}});t1.start();t1.join();t2.start();t2.join();Thread.sleep(1000);System.out.println(count);}
}

最终的结果为:20000
此时上述的反应就被称为——“线程不安全”

不会出现问题的可能

  1. 如果线程重复的次数少:其运行的速度非常快,会出现一个线程执行完了,另一个线程还没有开始执行——结果就是正确的
    eg:
public class Test {public static int count = 0;public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()->{for (int i = 0; i < 10; i++) {count++;}});Thread t2 = new Thread(()->{for (int i = 0; i < 10; i++) {count++;}});t1.start();//t1.join();t2.start();//t2.join();Thread.sleep(1000);System.out.println(count);}
}

此时的结果就是正确的;
由于他的速度非常快,在状态转化的过程当中前一个线程就已经完成了操作

埋坑问题

  1. 在上述的代码当中是否可能出现最终打印的结果<5000
    答:可能会出现
    解释图片:
    请添加图片描述
    在上面的情况中会出现最终打印的1
  2. 那由上面问题 ,是否最终在我们之前写的代码中出现打印1的情况
    答:这个是不太可能的
    因为执行的次序是抢占资源的方式,在这个过程中,很少可能会出现4999都只由一个线程执行,然后由两一个线程进行收尾

总结(线程安全问题产生原因)

  1. 根本原因:操作系统对线程的调度是随机的,抢占式执行的方式
  2. 多个线程同时修改同一个变量
    以下是不会出现问题的情况:
    一个线程修改一个变量
    多个线程不同时修改同一个变量
    多个线程修改不同变量
    多个线程读取同一变量
  3. 修改操作不是原子的

进行解释:如果修改操作只对应一个cpu质量——此时原子的(例如没有多线程的时候,java当中的main线程就不会发生任何的问题)

如何解决线程安全问题

将他产生的原因尽行打破

1.根本原因:

这个是操作系统底层的设定,不能进行改变
或者自己写一个操作系统:两大难点1》技术上会非常难2》推广上会更加难

2.多线程同时修改一个变量

解决方法:调整代码结构【但是这种方法并不是通用的】

3.修改操作,不是原子的

这个是java当中解决线程安全问题,最主要的解决方案
加锁

关键字:synchronized
synchronized(加锁对象){——加锁操作
执行相关代码
}——解锁操作

加锁操作,不是将整个线程锁死在cpu上,禁止这个线程被其他的调度走,但是禁止其他线程重新加这个锁,避免其线程成的操作

java当中可以使用这个关键字修饰任何对象
只有两个线程针对同一个对象加锁操作,才会产生互斥效果

锁对象并不会影响这个对象其他方面的使用
结果展示:

public class Test2 {public static int count = 0;public static void main(String[] args) throws InterruptedException {Object o = new Object();Thread t1 = new Thread(()->{synchronized (o) {for (int i = 0; i < 10; i++) {count++;}}});Thread t2 = new Thread(()->{synchronized (o) {for (int i = 0; i < 10; i++) {count++;}}});t1.start();//t1.join();t2.start();//t2.join();Thread.sleep(1000);System.out.println(count);}
}

上述代码的最终的结果就可以被正确打印
对代码进行的解释:
请添加图片描述

注意:

在此过程中,只有针对同一个对象加锁才会有效果
在一般情况下:synchronized是对this进行加锁
当synchronized修饰static修饰的变量时,相当于针对类对象尽心的加锁操作

下一张会讲到死锁的问题,不要走开哦!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Infinite you:flexible photo recrafting while preserving your identity

基于DiT的id保留图像生成面临着多种挑战,缺乏定制模块设计,模型扩展的困难以及高质量数据的匮乏,因此基于flux的解决方案是相对稀缺的,pulid-flux是基于flux的id保留的初步尝试,包括instantx和xlabs-ai的flux.1-dev ip-adapters,现有方法在三个关键方面保险不足:1.身份相…

Unity 实现一个简易可拓展性的对话系统

本人能力有限,一切实现仅供参考,如有不足还请斧正 起因是我看到学校社团内有人做了对话系统的分享,我想了想之前没写过这种东西,而Fungus插件教程太老了,NodeCanvas插件学习成本又比较高,我就干脆寻找资料 加上自己迭代一下,花了一天时间完成了这个对话系统 目录 1.介绍 2.核…

linux常用指令(6)

今天我们继续学习一些linux常用指令,丰富我们linux基础知识,那么话不多说,来看. 1.cp指令 功能描述&#xff1a;拷贝文件到指定目录 基本语法&#xff1a;cp [选项] source dest 常用选项&#xff1a;-r&#xff1a;递归复制整个文件夹 拷贝文件&#xff1a; 拷贝文件夹&am…

Vue 3 中的路由传参详解※※※※

前言 在Vue应用中&#xff0c;路由传参是非常常见的需求&#xff0c;它允许我们在不同的组件之间传递数据。Vue Router提供了两种主要的方式来传递参数&#xff1a;query参数和params参数。下面我们将详细探讨这两种传参方式的使用方法和注意事项。 一、query参数 Query参数…

友思特应用 | 行业首创:基于深度学习视觉平台的AI驱动轮胎检测自动化

导读 全球领先的轮胎制造商 NEXEN TIRE 在其轮胎生产检测过程中使用了基于友思特伙伴Neurocle开发的AI深度学习视觉平台&#xff0c;实现缺陷检测率高达99.96%&#xff0c;是该行业首个使用AI平台技术推动缺陷检测自动化流程的企业。 将AI应用从轮胎开发扩展到制造过程 2024年…

前后端+数据库的项目实战:hbu迎新网-较复杂(下)javaweb

目录 十一、实现对内容的富文本编辑&#xff08;换行、图片颜色等等样式&#xff09; &#xff08;1&#xff09;下载富文本编辑器&#xff0c;引入资源 &#xff08;2&#xff09;将原项目的内容部分替换为富文本编辑器 1、替换添加页面 2、替换修改页面&#xff08;和添…

【数据分享】2000—2024年我国乡镇的逐月归一化植被指数(NDVI)数据(Shp/Excel格式)

之前我们分享过2000—2024年我国省市县三级逐月归一化植被指数&#xff08;NDVI&#xff09;数据&#xff0c;该数据是基于NASA定期发布的MOD13A3数据集中的月度NDVI栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;计算得出。很多小伙伴拿到数据后反馈是否可以处理出…

轻松迁移 Elasticsearch 数据:如何将自建索引导出并导入到另一个实例

概述 在日常的 Elasticsearch 运维和数据管理中&#xff0c;数据迁移是一个常见的需求。无论是为了备份、升级&#xff0c;还是将数据从一个集群迁移到另一个集群&#xff0c;导出和导入索引数据都是至关重要的操作。本文将详细介绍如何将自建 Elasticsearch 实例中的索引数据…

word插入Mathtype公式居中和自动更新

word插入公式自动更新 前提&#xff1a;安装Mathtype 1.word中查看页的宽度 出现如下 2.设置样式 出现这个窗口 给样式随便起个名字 3.修改样式 3.1 设置两个制表位 第二个 3.2 修改公式字体 如下所示 4. 修改公式格式 4.1在word中打开 Mathtype 4.2 修改公式的格式 变成…

如何从后端实现页面跳转?

例&#xff1a;请求转发 例&#xff1a;重定向 例&#xff1a;区别&#xff1a;携带参数的后端跳转 例&#xff1a;是否可以访问外部资源 请求转发&#xff1a;客户端发起一个请求到服务端&#xff0c;服务端把这个请求转发至其他地方 重定向&#xff1a;客户端发起一个请求…

APIJSON快速入门

作者 版本 时间 内容 备注 Allen V1.0.0 2021/08/19 初稿完成 AllenV1.0.1 2021/08/22 添加常见问题 1.流程说明 一个接口的开发,比如Java用SpringBoot,Mybatis来开发一般来说就像下面这个流程 部署上这个项目后,流程变成了这样 如果使用 apijson-framework,还可进一步简化…

基于springboot的星之语明星周边产品销售网站(050)

摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应洗衣店业务新的交流形式的网站。本文介绍了星之语明星周边产品销售网站的开发全过程。通过分析企业对于星之语明星周边产品销售网站的需求&#xff0c;创建了一…

从零到一开发一款 DeepSeek 聊天机器人

AI聊天机器人 目标设计方案系统架构技术选型功能模块 实现代码环境配置安装依赖 核心代码API 请求函数主循环函数 功能扩展1. 情感分析2. 多语言支持3. 上下文记忆4. 用户身份识别 总结附录 目标 开发一个智能聊天机器人&#xff0c;旨在为用户提供自然、流畅的对话体验。通过…

pfsense部署三(snort各版块使用)

在上篇文章上我们已经进行了snort的基础配置了&#xff0c;接下来需要进行snort的具体配置&#xff0c;其中包括各板块的设置&#xff0c;例&#xff1a;白名单&#xff0c;警报&#xff0c;规则设置等 规则库配置 点击 service > snort > Global Settings ,在code值…

汽车制造MES

一、整体生产工序 整车的车间主要分为4个部分&#xff1a;冲压、焊装、涂装、总装、整车入库 系统架构 二、车间概括 1.冲压车间 2.焊装车间 3.涂装车间 4.总装车间 1.整车装配的部件都要可追溯、数据实时性要求高、涉及分装与总装的协调、物流配送的协调、质量批处理的协调、…

python接口自动化pytest+request+allure

自己自学接口自动化过程遇到的问题及解决方法记录 首先是一个简单的请求 import requests#这是一个简单是get请求 def test_get():geturl https://so.csdn.net/api/v1/relevant-search?querypycharm%E5%AE%89%E8%A3%85requests%E5%BA%93&platformpcgetr requests.get(…

关于kafka的一些知识总结

Kafka 1. 基本知识 1.1 前置知识 topic表示一个类型/业务的数据的组为方便扩展&#xff0c;提高吞吐率&#xff0c;一个topic分为多个partition。配合分区的设计&#xff0c;提出消费者组的概念&#xff0c;每个消费者并行消费&#xff0c;同时&#xff0c;一个分区的数据&a…

深入理解traceroute命令及其原理

traceroute 是一个网络诊断工具&#xff08;Windows上叫tracert&#xff09;&#xff0c;用于显示数据包从本地主机到远程主机经过的路由&#xff08;跳数&#xff09;。它可以帮助您了解数据包在网络中的传输路径&#xff0c;以及每跳的延迟情况。这对于网络故障排除、分析网络…

Spring 6: 3容器-Ioc

3、容器&#xff1a;IoC IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出松耦合、更优良的程序。 Spring 通过 IoC 容…

git推送代码相关学习——(一)

推荐去阅读一下廖老师的git相关的教程https://liaoxuefeng.com/books/git/introduction/index.html 这个系列就来学习一下git操作。 第一步&#xff0c;新建项目 去github中新建一个项目&#xff0c;然后依据项目来进行本地的开发工作。 第二步&#xff0c;拉取项目 git c…