关于编程路上的一些杂谈 由线程的通信原理想到的 (一)

本贴最后更新于 2636 天前,其中的信息可能已经时过境迁

写这个其实想了很多,到底该用什么方式来写,最后还是按照自己的随意来随意的拉拉家常算了。时常听说身边和网友说自己遇到瓶颈,接下来不知道该往哪里走,我给的建议就是:请回归基础

为何这样说,先拿一个大家都知道的东西来说,并发编程中 ,线程之间如何通信及线程之间如何同步 ,线程之间的通信机制有两种:共享内存和消息传递 ,如图:

如果线程 A 与线程 B 之间要通信的话,必须要经历下面 2 个步骤:

  1. 线程 A 把本地内存 A 中更新过的共享变量刷新到主内存中去。
  2. 线程 B 到主内存中去读取线程 A 之前已更新过的共享变量。

好了,就言仅于此,接下来我们跳过这里看一个让人感觉离的比较远的东西。

就拿大家觉得比较在上层的 zookeeper 来讲,分布式锁这个概念相信不少人都听过,Linux 文件系统的组成相信大家也一定知道点,最起码的是这个文件系统是以树的形式组织起来的,知道这个其实你就已经理解了三分之一了,因为 zookeeper 的数据结构也是这么组织的,也是一棵树的形式,其实大家很自然就想到了 b+ 树这个概念,这也是面试里为何会经常问到 b+ 树到底是个什么东西,回到正题,当大家一谈分布式这个概念的时候,往往就会觉得头大,不想触碰,我觉得无非就是几份同样的代码给分放到不同的机器里来运行,各自有各自的 web 服务器,而我们可以很自然的把相应的服务器看成是一个容器,也就是上下文,其实也就是上图里 A 和 B 线程相当于是两台机器,而共享变量的副本其实就是各自机器里的上下文而已,这么看来,所谓的分布式不也就是我们在单机上操作的多线程么,又有何高大上可言。

既然搞分布式,那么我们接下来要解决的就是两台机器间的通信问题,也就是线程之间如何通信及线程之间如何同步变成了分布式环境下两台机器如何进行通信和同步,同样的,我们需要一个所谓的主存,这里的主存就是 zookeeper,这里先对大致的原理说下,在以后的文章里会对细节各种说道的,使用过 zookeeper 的都知道,我们可以通过相应的 API(个人推荐 Curator)在 zookeeper 里创建一个临时的节点,一个操作 session 结束这个节点的生命周期也就结束销毁了,利用这个特性,我们在 A 机器修改某一个共享变量的时候,会先在 zookeeper 里获取下有没有这个节点,没有则创建,有则等待(因为是同一份代码,所以创建的节点也会相同),这样便不会对共享变量同时进行多次操作,具体的实现细节以后再说,其实这个 api 的写法和 Java 底层的源码没多大区别,用法也没多少区别。

其实所说的就是分布式锁的原理,其实我们是可以从 volatile 的语义联系到锁的语义的,拿 ReentrantLock 来说,其底层也无非是维护一个节点(请看下图),用的也是 volatile 语义,再回头看看 zookeeper 的这种操作方式,难道还有疑虑么,所谓的抽象出来的高度的东西,其实还是底层的一些实现,用的代码也逃不出底层代码那些套路,包括 zookeeper 里的 barrier,计数器等等。

这次就暂时说到这里了,篇幅长了大家也没人看,下一篇想想,最近两个月一直在用通用 mapper,不如来讲下通用 mapper 是如何根据 mybatis 生成的东西做的一系列组合封装,方便大家项目中使用相应的思想,后面依然会回到基础和上层一些架构框架之间的联系上来,不仅仅是多线程这块的东西。

  • 编程
    50 引用 • 257 回帖 • 3 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 17 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • whxiaobu
    作者

    寄己占个沙发!晚上更新第二篇吧~~~

  • 其他回帖
  • whxiaobu
    作者

    嫂子好。哈哈哈,要是我有这本事,我就可以通天了!说不定当年大脑天宫的就是我了!
    这是别人写的!

    1 回复
  • 被吓到了,还以为运营也会写这样的文章

    1 回复
  • 嗯,听 D 说了。加油加油

推荐标签 标签

  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 592 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    331 引用 • 315 回帖 • 84 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    330 引用 • 612 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    308 引用 • 1658 回帖 • 1 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    90 引用 • 383 回帖
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 33 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 17 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 17 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 247 回帖 • 212 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    25 引用 • 215 回帖 • 163 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 7 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 506 关注
  • 音乐

    你听到信仰的声音了么?

    58 引用 • 507 回帖 • 1 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 3 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    21 引用 • 22 回帖 • 1 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    14 引用 • 7 回帖
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 113 回帖 • 321 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 632 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1397 回帖 • 1 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    673 引用 • 535 回帖
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    914 引用 • 930 回帖 • 1 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    710 引用 • 1173 回帖 • 192 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 395 关注
  • Sillot

    Sillot (汐洛)孵化自思源笔记,致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点
    Github 地址:https://github.com/Hi-Windom/Sillot

    12 引用 • 26 关注