java多线程编程基础一

java多线程的实现方式:

  1. 实现runnable接口
  2. 继承thread类

java程序运行的方式:

  1. 串行
  2. 并行
  3. 并发

多线程编程相关概念:

  1. 状态变量:即类的实例变量、静态变量
  2. 共享变量:可以被多个线程访问的变量。共享是指变量有可能被共享,而不是一定会被共享。状态变量也是共享变量
  3. 局部变量:方法内部定义的变量,非共享变量

java多线程面临的问题:

1、竞态

多线程编程式出现的,同样的输入,输出的结果有时正确有时不正确

竞态的两种模式:
  • read-modify-read(读-改-写)
  • check-then-act(检测而后行动)
2、线程安全
原子性
  • 是针对共享变量操作而言
  • 只有多线程环境下有意义
  • 访问(读、写)某个共享变量的操作,从其执行线程以外的其它线程来看,该操作要么尚未发生,要么已经结束,即其它线程不能看到执行的中间状态
  • 访问同一组共享变量的原子操作是不能被交错的
  • 实现原子性的方式:使用锁(Lock),使用CAS(处理器指令,硬件锁)
  • java语言中,除了long、double之外,其它基本数据类型都是原子性的操作
  • java中所有变量的读操作都是原子性的
  • volatile关键字可以实现变量的写操作的原子性
有序性

有序性是指,在某种情况下一个处理器上运行的线程所执行的内存访问操作,在另外一个处理器上运行的其它线程来说是乱序的。这涉及到重排序的概念。

  • 可见性是有序性的基础
重排序
  • 顺序结构是结构化编程的一种基本结构。
  • 在多核处理器下,这种顺序结构会被打乱,处理器可能不会按照原本编程指定的顺序执行指令
  • 一个处理器上执行的多个操作,从其他处理器的角度来看其顺序可能与目标代码所指定的顺序不一致。这种现象就叫作重排序(Reordering)。
  • 重排序是对内存访问有关的操作(读、写)所做的优化,其会在不影响单线程程序正确的情况下提升性能。但是在多线程环境下,会产生不正确的结果,即导致线程安全问题。
  • 重排序与可见性一样,不是必然出现的
术语定义:
  • 源代码顺序( Source Code ):源代码中所指定的内存访问操作顺序。
  • 程序顺序( Program Order ):在给定处理器上运行的目标代码( Object Code )所指定的内存访问操作顺序。尽管Java 虚拟机执行Java 代码有两种方式: 解释执行(被执行的是字节码Byte Code )和编译执行(被执行的是机器码) 。为便于讨论,这里仅将目标代码定义为字节码。
  • 执行顺序( Execution Order ) :内存访问操作在给定处理器上的实际执行顺序。
  • 感知顺序( Perceived Order ) : 给定处理器所感知到(看到) 的该处理器及其他处理器的内存访问操作发生的顺序。
重排序包括:指令重排序和存储子系统重排序
可见性

针对共享变量,多线程操作时,一个线程更新了共享变量,其它线程可能永远读取不到更新后的结果。
如果一个线程针对某个共享变量做了更新操作,其它线程能够获取到更新后的结果,即共享变量可见;否则不可见

处理器并不是直接操作主内存(ARM)而执行内存的读写操作,而是通过寄存器(register)、高速缓存(cache)、写缓存器(storeBuffer,又称writerBuffer)和无效化队列(invalidate queue),等部件实现内存的读、写操作。

volatile关键字可以保证可见性,内部运行逻辑:
  • 提示JIT编译器被修饰的变量可能被多个线程共享,以阻止JIT编译器做出可能导致程序运行不正常的优化。(JIT编译器会将对未做明确多线程共享提示的变量执行优化,避免重复读取状态变量,进而导致在多线程环境下,状态变量不能被其它线程正确的读取)

  • 多处理器情况下,处理器与处理器之间只能通过缓存同步实现变量状态共享,不能直接获取。

  • 可见性,跟处理器无关,单处理器也存在可见性问题

3、上下文切换

上下文切换在一定程度上可以看做多个线程共享同一个处理器的产物

产生原因:

单处理器下的多线程的运行是基于时间片“time slice”分配的方式执行的。根据处理器、或者程序执行,处理器交替执行多线程程序的过程(一个线程由于自身暂停或停止被剥夺处理器使用权,被称为切出;一个线程被系统分配到处理器的使用权,成为切入),成为上下文切换。

分类:
  • 自发性上下文切换:程序自我处理切出
  • 非自发性上下文切换:由于线程调度器被强行切出

4、线程活性故障

由于资源稀缺,或者线程自身问题和缺陷的原因,导致线程一致处于非RUNNABLE状态;
线程处于RUNNABLE状态,但是要执行的任务一致无法处理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352