首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

【并发那些事】可见性问题的万恶之源

还记得那些年,你写的那些多线程 BUG 吗?明明只想得到个 1 + 1 = 2 的预期,结果他有时候得到 1,有时候得到 3,但偏偏有时候他也会返回正确的 2。明明在本地运行的好好的,一上线一堆诡异的 BUG。你一遍一遍的检查代码,一行一行 debug,结果无功而返。 变量为何突然变异?代码为何乱序运行?条件为何形同虚设?欢迎收看今天的《走进科学》之半夜。。。哦,不对,欢迎阅读今天的《并发那些事》之可见性问题的万恶之源。就像上面说的,我们在写并发程序时,经常会出现超出我们认识与直觉的问题,而按我们的以往的经验,很难去察觉到他的问题所在。而又因为我们不了解他发生的诱因,即使我们按照书上的方案解决了,但是下次还是会出现。所以本文的主旨并不是解决问题的术,而是解决问题的道。一起来探究多线程问题的根源。 首先揭开谜底,大多数并发问题的发生都是这三个问题导致的,可见性问题、原子性问题、有序性问题。那么又是什么导致这三个问题的出现呢?本文将一步步解析可见性问题出现的原因。

02

Java中类加载器

在上一篇类加载中我们介绍了一个类要加载到内存中要分为7个步骤。其中第一步就是加载也就是通过类的全限定名来获取类的二进制字节流。在Java中把上述加载的过程定义了一个模块叫做类加载器,目的是可以让用户自己决定如何加载一个类。类加载器虽然只是实现类的加载动作,但它在Java中起到的作用却远远要比类加载的功能要重要的多。原因就是类加载器在加载的过程中,会有一些特殊的特性来保证Java的运行安全。例如,每一个类加载器,都有一个独立的类名称空间。说白点就是如果要比较两个类是否相等,必须有一个前提,就是这两个类必须是同一个类加载器加载的,否则,即使比较的是同一个类,如果它们是由不同的类加载器加载的,那么这两个类也是不相等的。除了上述特性外,还有一个非常重要的特性就是双亲委派模式。在介绍双亲委派模式之前我们先看一下在虚拟机中一共都有哪些类加载器。

02

数据库的分类

1.1 什么是数据库? 简单的说,数据库(英文Database)就是一个存放数据的仓库,这个仓库是按照一定 的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织、存储的、我们可以通过 数据库提供的多种方法来管理数据库里的数据更简单的形象理解。 1.2 数据库的种类 早期比较流行的数据库模型有三种,分别为层次式数据库、网络式数据库和关系型数据库。 而在当今的互联网中,最常用的数据库模型主要是两种,即关系型数据库和非关系型数据库。 1.3 关系型数据库介绍 (1)关系型数据库由来 网络数据库和层次数据库很好地解决了数据的集中和共享问题,但是在数据独立性和抽象 级别上仍有很大欠缺。用户对这两种数据库进行存取时,依然需要明确数据的存储结构, 支出存储路径。而关系数据库就可以较好地解决这些问 (2)关系型数据库介绍 关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。 1.4分布式数据库与面向对象数据库 分布式数据库是数据库技术与网络技术相互结合的产物,他的重要特性就是数据分布的透明性 ,分布式数据库系统是一个统一的整体,用户不需要关心数据的逻辑分布,更不必关心数 据的物理分布 面向对象数据库是数据库技术与面向对象设计方法相结合的产物。在这一新型的数据库系统中 ,任何被开发的应用都成为对象目标库的一部分,由开发者和用户共享。

02
领券