Java 多线程篇

叁歲伎倆 2023-06-24 15:27 27阅读 0赞

java 线程状态

https://www.cnblogs.com/nongzihong/p/10512822.html(线程的状态)

https://www.cnblogs.com/chaguang/p/7818456.html(操作系统线程结构)

1.线程start方法执行后,并不表示线程运行了,而是进入就绪状态,什么时候运行由操作系统决定

2.运行的线程,也可能由于失去CPU回到就绪,操作系统线程调度让线程失去CPU,或程序调用yield

3.线程运行完毕、运行一半异常、主动调用stop方法,就进入死亡

4.下面几个行为,会引起线程阻塞:

  • 主动调用sleep。时间到了进入就绪
  • 主动调用suspend方法。主动调用resume方法进入就绪
  • 调用了阻塞IO方法。调用完成后,就入就绪
  • 试图获取锁。成功获取到锁之后,进入就绪
  • 线程等待某个通知。其他线程发出通知,会进入就绪状态

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9uaWFvZmVpZmVpMzU_size_16_color_FFFFFF_t_70

线程通信

  • while 循环来检查莫已条件,缺点:浪费CPU资源
  • wait/notify 机制

调用某个对象的notify()方法阻塞当前线程,并且当前线程必须拥有此对象的monitor锁

  • Condition 类似于Object的wait()/notify(),配合Lock使用;使用await()/signal()方式更加安全和高效的实现线程协作。

java 线程通信:wait/notify join ,Condition 生产者、消费者 ,线程通信管道

java 并发模型

线程池实现原理:

java 内存模型

https://www.jianshu.com/p/15106e9c4bf3

http://developer.51cto.com/art/201807/579744.htm(终于有人吧java内存模型讲清了)

定义:java内存模型(java memory model ,JMM)是java虚拟机规范定义的,用了屏蔽调java程序在不同的硬件和操作系统对内存访问的差异,确保在不同平台对内存访问的一致性。

面临的问题:CUP运行速度与硬件的差异(IO,网络、内存),多核时数据的一致性、正确性等问题。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9uaWFvZmVpZmVpMzU_size_16_color_FFFFFF_t_70 1

问题:CPU与缓存一致性、处理器优化、指令重排

计算机内存模型定义:定义了多线程对共享内存的读写规范

java内存模型:java语言实现的, (java语言是跨平台,所以还屏蔽的不同硬件与操作系统的差异)

java内存模型的内容:

1.所有数据都存储在主内存,线程又自己的工作内存

2.工作内存保存了线程用到的主内存副本拷贝,线程对变量的所以操作都在工作内存中进行

3.不同线程无法访问对方工作内存,数据传递需通过住内存

(工作内存与主内存之间数据同步过程)

java内存模型实现:volatil,syn,final,concurrent包。

https://www.jianshu.com/p/60f661d95d53(FutureTask设计原理)

https://www.cnblogs.com/yangming1996/p/7612653.html(Java并发之线程中断)

http://developer.51cto.com/art/201807/579744.htm(什么是java内存模型)

发表评论

表情:
评论列表 (有 0 条评论,27人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java线入门

    1 说到线程,首先来说下进程,以下是进程的定义: 进程是操作系统结构的基础,是程序的一次执行,是一个程序及其数据结构在处理机上顺序执行时所发生的活动,是程序在一个数据集合

    相关 Java——线入门

    1.线程概述 几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程,当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执

    相关 java线总结 - 基础

    进程与线程区别 进程是资源分配的最小单位,进程中会有多个线程。引入线程的目的是因为计算机cpu上下文切换会很频繁,而进程的上下文切换相对耗时耗资源。 而线程是在进程中