当前位置: 首页 > news >正文

html5做的篮球网站网站建设合作合同模板

html5做的篮球网站,网站建设合作合同模板,uemo网站平台建设,360安全导航网址目录 一、线程安全的概念 二、线程不安全经典示例 三、线程不安全的原因和处理方式 3.1 线程的随机调度和抢占式执行 3.2 修改共享数据 3.3 关键代码或指令不是“原子”的 3.4 内存可见性和指令重排序 四、Java标准库自带的线程安全类 一、线程安全的概念 线程安全是指…目录 一、线程安全的概念 二、线程不安全经典示例 三、线程不安全的原因和处理方式 3.1 线程的随机调度和抢占式执行 3.2 修改共享数据 3.3 关键代码或指令不是“原子”的 3.4 内存可见性和指令重排序 四、Java标准库自带的线程安全类 一、线程安全的概念 线程安全是指某段代码无论是在单线程还是多线程的环境下执行结果都是正确的或符合心理预期的。通常情况下如果一段代码在单线程环境下执行和在多线程环境下执行的结果不一致那么就很可能存在线程安全的问题这个情况就称为“线程不安全”。线程安全问题是多线程编程的重点 二、线程不安全经典示例 class AddTest{public static int count 0;public void add(){count;} } public class Synchronized_Demo0 {public static void main(String[] args) throws InterruptedException {//创建一个AddTest实例AddTest test1 new AddTest();//两个循环调用add方法进行count的线程Thread t1 new Thread(()-{for (int i 0; i 5000; i) {test1.add();}});Thread t2 new Thread(()-{for (int i 0; i 5000; i) {test1.add();}});//启动线程t1.start();t2.start();//阻塞main线程t1.join();t2.join();//打印countSystem.out.println(count AddTest.count);} }//第一次运行结果 count 8061 //第二次运行结果 count 7269 //第三次运行结果 count 9792 在单线程环境下两个5000次循环的count得到的结果应该是count 10000。 上述代码在多线程的环境下得到的结果却是count 8061。 而且每次运行得到的结果都会不同。这就出现了线程安全问题。 三、线程不安全的原因和处理方式 线程不安全的五个原因1线程的随机调度和抢占式执行(根本原因)。2修改共享数据。3关键代码或指令不是“原子”的(直接原因)。4内存可见性。5指令重排序。 3.1 线程的随机调度和抢占式执行 原因和处理方式 原因操作系统上的线程是“随机调度”和“抢占式执行”的这是产生线程安全问题的根本原因。处理方式这个原因是由操作系统本身决定的无法改变。 3.2 修改共享数据 前置知识点 上述代码中“count”这一句代码实际上是由三条系统指令完成的。包括以下三条指令load(读取)从内存中读取数据add(运算)进行数据运算save(写入)将运算后的数据写入内存中 根据下图进行分析 在示例代码中有多个线程在“同一时刻”访问了同一变量(count)这个变量就是一个“共享数据”。 通过以上分析我们发现可以使用两个不同的变量自增自增完成后再相加可以解决这里的线程不安全问题。 原因和处理方式 原因多个线程修改同一个变量。处理方式这是一个与代码结果相关的问题有时可以通过调整代码结构解决但有时代码结构是无法调整的。 3.3 关键代码或指令不是“原子”的 根据下图进行分析 原因和处理方式 原因代码中影响线程安全的关键代码或指令不是“原子”的。这是产生线程不安全的直接原因。处理方式使用 synchronized 关键字加锁是代码或指令实现逻辑上的原子性即当线程在执行这些代码或指令时要么全部不执行要么全部执行完毕后其他线程才能进入。 应该注意这里的加锁并不是让代码或指令实现真正的原子性。 也就是说不是真的在执行加锁的代码或指令时不让线程被调度走而是线程仍可以“暂时离开”。 但此时其他线程也不得进入这段被执行了“一半”的加锁代码或指令。 如上文所讲的是“打包”为一个逻辑上的整体。 阅读指针 - 《 synchronized 关键字 和 锁机制 》 JavaEE synchronized关键字和锁机制 -- 锁的特点、锁的使用、锁竞争和死锁、死锁的解决方法-CSDN博客Java中加锁的方式有很多种其中使用 synchronized 关键字进行加锁是最常用的。synchronized 是一种监视器锁monitor lock。是为了将多个操作“打包”为一个有“原子性”的操作。进行加锁的时候必须先准备好“锁对象”锁对象可以是任何类型的实例。synchronized 的底层是使用操作系统的 mutex lock 实现的本质上依然是调用系统的 API 依靠 CPU 的特定指令完成加锁功能的。https://blog.csdn.net/zzy734437202/article/details/134742168 3.4 内存可见性和指令重排序 原因内存可见性指的是一个线程对共享数据的修改能否即使被其他线程观测到。如果没有那么其他线程则无法获得正确数据。原因 指令重排序是指在“保证程序执行逻辑不变”的情况下改变指令的执行顺序以提高编译器的运行效率。 指令重排序在单线程下非常有效但在多线程下对于“保证程序执行逻辑不变”这一条件判断难度高因此会出现因为指令重排序而导致的线程不安全。 处理方式 以上的两个产生线程不安全的原因都来自于编译器优化本意是通过调整指令执行顺序提高程序效率但在多线程环境下会导致线程不安全。 为应对这种情况Java提供了 volatile 关键字用于强制关闭编译器优化。 volatile 关键字的两大核心功能就是保证内存可见性和进制指令重排序。 阅读指针 - 《 volatile 关键字的 功能 和 使用 》 JavaEE volatile关键字 -- 保证内存可见性、禁止指令重排序-CSDN博客简单介绍什么是内存可见性和指令重排序。volatile关键字可以将这两种编译器优化强制关闭。https://blog.csdn.net/zzy734437202/article/details/134757070 四、Java标准库自带的线程安全类 Java标准库中有很多类虽然涉及多线程修改共享数据但又没有加锁措施因此他们都是线程不安全的。 线程不安全的类 ArrayListLinkedListHashMapTreeMapHashSetTreeSetStringBuiler 当然也有一些线程安全的类。 以下的类通过锁机制使得在多线程下产生线程安全问题的概率大大降低了。 线程安全的类VectorHashTableConcurrentHashMapStringBuffer可以看到有一些类被添加了删除线。是的根据官方文档推荐不再使用这几个类因为它们即将被标准库弃用。String字符串类比较特殊因为String本身就是不可变的因此它就是线程安全的。 阅读指针 - 《 多线程编程中的“等待和通知机制”wait 和 notify 方法 》 JavaEE 多线程编程中的“等待和通知机制”wait 和 notify 方法-CSDN博客文章浏览阅读8次。介绍了由 wait 和 notify 方法组成的等待和通知机制。https://blog.csdn.net/zzy734437202/article/details/134774218
http://www.hkea.cn/news/14586674/

相关文章:

  • 网站建设 实施计划桂林网站推广
  • 贵州省交通工程建设质监局网站常州做半导体的公司
  • 杭州网站建设优化wordpress头错位
  • 申请域名流程后怎样做网站注册工程公司名称大全
  • 公司网站别人做的怎么签合同网页制作与网站建设...
  • 网站开发安全郑州网站开发设计公司电话
  • 网站外链宁波网站建设最好
  • 电力建设规范下载网站wordpress不显示评论
  • 企业网站建立步骤深圳的网站建设公司
  • 大学生活动网站开发文案网站分辨率做96是否会更好
  • 网站开发 技术投标郑州网站托管公司哪家好
  • 营销公司网站网站制作合肥
  • tomcat 网站开发php空间购买
  • 建设网站的结束语中云建设集团网站
  • 网站建设前期如何做好市场定位分析科技部 咖啡
  • 佛山定制网站建设wordpress表单统计插件下载
  • 刷单做任务的网站宣传视频制作
  • 网站建设公司怎么运营稷山网站制作
  • 专门做喷涂设备的网站郑州一站式网站搭建
  • 网站建设开票内容些什么百度明星人气榜排名
  • 商丘市网站建设推广建材网站建设方案
  • 打开网址跳转到国外网站wordpress柒比貳
  • 房地产网站建设需求说明书wordpress打开过慢
  • 正规的营销型网站建设公司网站标签中的图片怎么做的
  • 网站建设的资源哪里弄详情页设计模板图片
  • 网站线上投票怎样做余姚企业网站建设公司
  • 高端营销型企业网站建设利用wordpress的page
  • 网站设计建设 公司有没有网站做lol网站的
  • 网站的分析与设计视频网站如何做
  • 青州做网站东莞app开发定制