多线程和并发
李乐客
喜欢钻研技术,寻找编程中的乐趣。
展开
-
多线程并发总结一 基础
平日主要是开发企业信息系统,所以使用到多线程的时候不多,但是相关的知识又很多很复杂,所以就在这里做一些总结吧。我主要做Java为主,这里记录的会是很多跟Java相关,但是我想多线程的问题,很多又是相通的。先说说多线程的难度吧,这个可以跟多线程相关问题形成的原因有关首先它是因为有共享的可变变量 因为代码的执行顺序是可以在编译或执行时优化的,所以以为已经执行的代码,其实还没有执行通过各...原创 2019-09-15 21:48:12 · 116 阅读 · 0 评论 -
多线程并发总结二 各种Java工具
这里总结一下Java提供的一些多线程开发工具。Atomic变量 代码排斥/等待,唤醒 锁 Semaphore Latch / Cyclic Barrier Exchanger Volatile Final Concurrent Map CopyOnWriteArrayList ExecutorAtomic变量Atomic变量最主要的是解决了普通Java变量读写操作的原...原创 2019-09-20 21:27:17 · 127 阅读 · 0 评论 -
多线程并发总结三 函数式编程
多线程的问题根本上面就是因为存在共享的可变变量导致的。所以如果变量不共享,或者不可变,那么就不会有多线程的问题了。所以如果我们改变一下我们写代码所使用的范式,改成函数式,那么多线程的问题也就迎刃而解了。在函数式的规范下面,我们写出来的函数都是纯函数,函数里面既没有变量也没有对外访问的IO操作。纯函数在任何的时候去访问它,给到的返回值都是一样的。那么如果不访问IO,那么我们的系统...原创 2019-09-23 00:32:15 · 1014 阅读 · 0 评论 -
多线程并发总结四 STM
如果我们要处理的情况符合下面的几种之一,我们可以考虑一下使用非阻塞的方式来处理并发的情况。有多线程的情况要处理,但是很少出现并发冲突的,比如以读取为主的 涉及到的并发逻辑非常复杂,希望可以减低并发代码出错的可能和保持并发代码的可读性。非阻塞的代码可以较大限度的保持并发代码的可读性。它的原理就像下面的伪代码AtomicInteger ai = new AtomicInteger(1);...原创 2019-10-01 20:14:12 · 450 阅读 · 0 评论 -
多线程并发总结五 CSP
CSP本身是一套数学语言,用来描述Process以及Process之间的通讯的。当一个Process使用数学语言描述了出来,我们就可以对其进行数学推导简化和分析,比如研究会不会发生死锁和进入发散无序状态等等。既然CSP可以用来分析多线程的,那么计算机语言也提供了对应的支持。其中支持得最好的就是Golang,它是我理解的第一只对CSP提供语言原生支持的语言。其中协程就是CSP中的Proces...原创 2019-10-01 21:06:59 · 302 阅读 · 0 评论 -
多线程并发总结六 Actor Model和Event Driven
Actor Model也能有效的解决多线程的问题,跟CSP类似,他也是可以让变量由某一个Actor专门负责,而Actor是只会被一个线程执行的,所以也不会有多线程的问题。Actor模型中的Actor类似CSP中的Process。CSP中的Process通讯相当于Actor中的信箱。只是两者的定位并不一样,CSP主要用来解决某一个进程中的多线程问题,而Actor模型是一个分布式系统的逻辑架构...原创 2019-10-01 21:51:03 · 372 阅读 · 0 评论 -
多线程并发总结七 GPU
GPU也可以实现并发计算原创 2019-10-01 22:38:49 · 3359 阅读 · 0 评论 -
多线程并发总结 interrupt
Interrupt也是写多线程的时候需要注意的一个地方。有时候需要停掉Java的一个线程,这个时候推荐使用的是intertupt的方法。但是这个方法其实不会直接把线程停掉,只会在一个线程的标志位上面标注当前线程已经被标记成interrupted了。为什么会是这样操作的呢?我觉得也很容易理解,因为如果硬性中止一个线程,我们根本不知道是不是还有一些资源是没有正常关闭回收的,也就有可能让系统...原创 2019-10-04 21:37:26 · 154 阅读 · 0 评论