2016-04-27 Li Shuai
GIL 熟悉Python的人对GIL这货可定都不陌生, 全局解释器锁(Global Interpreter Lock)简称GIL, 这货是 Python多线程的核心机制。由于Python的线程实际是操作系统的原生线程,多个线程同时执行同一段字节码可能 会导致很多问题(比如: 内存管理的引用计数需要线程安全机制的保护),于是使用GIL这把大锁锁住其他线程,保 证同一时刻只有一个线程可以解释执行字节码。关于GIL的更多分析, 可以看David Beazley大神的研究。本文主要分析下CPython的GIL在Linux上 基于pthread的实现细节,看完这些源码后能够对GIL有更深入的理解。 GIL的定义 有人可能会想,从GIL的 继续阅读 »
2014-08-20 veryyoung
Synchronized 是Java语言的关键字,可用来给对象和方法或者代码块加锁。 当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这个段代码。 当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。 另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 然而,当一个线程访问object的一个加锁代码块时,另一个线程仍然可以访问该object中的非加锁代码块。 synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。 如果再细的分类,synchronized可作用于instance变量、obj 继续阅读 »
2014-08-22 veryyoung
Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位。 计算机中的Atomic是指不能分割成若干部分的意思。如果一段代码被认为是Atomic,则表示这段代码在执行过程中,是不能被中断的。 通常来说,原子指令由硬件提供,供软件来实现原子方法(某个线程进入该方法后,就不会被中断,直到其执行完成)。 DK1.5的原子包:java.util.concurrent.atomic 这个包里面提供了一组原子类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择 继续阅读 »
2016-11-01 JustWe
Handler - Message - Looper 说起来也就是这么一回事,Looper实现在Thread中负责不断的循环监听处理Message,要不然Thread运行完就自己关了。当你不需要的时候就可以把Looper关了,线程就自动运行完了。 Message 实现了序列化接口,what区分类型,arg的参数使用简单的整形,obj存储对象,data存储一个bundle,target是一个Handler。剩下的就是搞了个对象池回收Message,所以才会推荐用Message.obtain()来新建,其实就是从回收池里拿东西。 总之没什么好说的。 Looper ``` java 继续阅读 »
2017-08-11 AnnatarHe
众所周知,Nginx 使用 异步, 事件驱动来接收连接。这就意味着对于每个请求不会新建一个专用的进程或者线程(就像传统服务端架构一样),它是在一个工作进程中接收多个连接和请求。为了达成这个目标,Nginx 用在一个非阻塞模式下的 sockets 来实现,并使用例如 epoll 和 kqueue 这样高效的方法。 继续阅读 »
2018-03-10 Xie Jingyi
写在前面 作者电脑 CPU 为 4 核,因此使用 4 个线程测试是合理的 本文使用的 cpython 版本为 3.6.4 本文使用的 pypy 版本为 5.9.0-beta0,兼容 Python 3.5 语法 本文使用的 jython 版本为 2.7.0,兼容 Python 2.7 语法 若无特殊说明,作语言解时,python 指 Python 语言;作解释器解时,python 指 cpython more 本文使用的测速函数代码如下: ```python from future import print_function import sys PY2 = sys.version_info[0] == 2 因为 Jython 继续阅读 »
2017-05-28 Lanffy
使用java.util.concurrent.ThreadFactory类创建线程 工厂设计模式是Java中最常用的设计模式之一。它是一种创建型设计模式,能够用于创建一个或多个类所需要的对象。有了这个工厂,我们就能集中的创建对象。 继续阅读 »
2014-05-27 veryyoung
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 继续阅读 »
2015-04-08 AllanChan
iOS GCD 基础名词解析: 串行与并行 串行和并行都是相对于队列而言的 -队列(负责调度任务) 串行队列:一个接一个的调度任务 并发队列:可以同时调度多个任务 同步与异步 串行与并行针对的是队列,而同步与异步,针对的则是线程。 最大的区别在于,同步线程要阻塞当前线程,必须要等待同步线程中的任务执行完,返回以后,才能继续执行下一任务;而异步线程则是不用等待。 仅凭这几句话还是很难理解,所以可以多准备几个案例,边分析边理解。 继续阅读 »
2015-04-10 Eric Wang
volatile概述 volatile关键字是一个类型修饰符,被设计用来修饰被不同线程访问和修改的变量,在JVM1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。 在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。 要解决这个问题,需要把变量声明为volatile(不稳定的),以后用到该变量都会到主存中进行存取,一般多任务环境下各任务间共享 继续阅读 »