Java并行程序基础

  • 2.1 线程和进程
  • 2.2 初始线程
    • 2.2.1 新建线程
    • 2.2.2 线程中断
    • 2.2.3 等待(wait)和通知(notify)
    • 2.2.4 挂起(suspend)和继续执行(resume)线程
    • 2.2.5 等待线程结束(join)和谦让(yield)
  • 2.3 volatile关键字
  • 2.4 线程组
  • 2.5 守护线程
  • 2.6 sychronized关键字
  • 2.7 隐蔽的错误

本节是《Java高并发程序设计》第二章的读书笔记,为尊重原创,需要详细阅读的建议购买原著。

2.1 线程和进程

1、进程是操作系统调度资源分配和调度的基本单位,进程相当于线程的容器,线程是轻量级进程,是程序执行的最小单位,使用多线程并行,是因为线程比进程的切换和调度的成本低。
2、线程的生命周期,
new创建线程,start()后,线程进入runnable状态,没有获得临界区资源进入BLOCKED阻塞状态,调用wait()等方法,进入waiting状态,等待某个预期状态出现后重新回到runnable,调用sleep()等方法,进入TIME_WATING状态,时间片用完或异常报错,进入TERMINATED状态。

2.2 初始线程

2.2.1 新建线程

1、继承Thread类,重写run方法,使用start()调用线程的run()
2、实现Runnable,可以用匿名内部类,实现run方法,将Runnable接口传入Thead的构造函数,因为Thread中有一个传入接口的构造函数,会调用接口的run方法,使用start()调用线程的run()。

2.2.2 线程中断

1、如果出现了wait()或sleep()方法,需要用Thread的中断函数

Thread.interrupt()   //中断线程,置标志位为true
Thread.isInterrupted()  //判断是否中断
Thread.interrupter()    //判断是否中断,并清除当前中断中断状态

使用sleep()或wait()方法时遇到中断会抛出checked异常,需要捕获此异常,设置Thread.interrupt()中断状态,通过代码中Thread.isInterrupted()检查中断状态来判断中断。

2.2.3 等待(wait)和通知(notify)

1、wait和notify是属于object方法的,二者都必须在sychronized代码块中使用,因为调用前必须要获取监控对象(monitor)。
2、wait()方法调用后,线程进入wait等待队列,notify()是随机唤醒从等待队列唤醒线程,notifyAll()是唤醒所有。
3、wait()方法调用后会释放所有的锁,保证其他线程能不被阻塞继续执行。sleep不释放锁。

2.2.4 挂起(suspend)和继续执行(resume)线程

1、suspend挂起后,不会释放锁,直到遇到resume()后线程才会继续执行,如果resume()在suspend()方法前执行了,那么系统可能工作异常,因此,这两个方法已经被丢弃。

2.2.5 等待线程结束(join)和谦让(yield)

1、join有两个方法

public final void join() throws InterruptedException
public final synchronized void join(long mills) throws InterruptedException

第一个方法是无限等待,直到目标线程执行完成
第二个方法是到指定时间后,线程继续执行
2、join的底层原理
本质也是调用了wait(),在目标线程执行完成后,调用notifyAll()唤醒所有的线程,因此,不要在Thread对象使用wait和notify等方法,避免引起API工作异常。
3、yield()是让线程让出CPU,但是让出后,同样会加入线程竞争。

2.3 volatile关键字

1、volatile保证了可见性、有序性和原子性
2、可见性和有序性不再赘述。
3、原子性可以理解为是sychronized的轻量级线程,不能保证复合操作和线程的原子性。
4、能避免重排序。

2.4 线程组

ThreadGroup tg = new ThreadGroup("PrintGroup");

1、将功能相同的线程放在一个线程中统一的管理,如使用activeCout()方法,stop()注意和Thread.stop()一样,可能会有数据不一致问题,list()方法等
2、注意的是,创建线程和线程组的命名要尽可能便于理解。

2.5 守护线程

1、用户线程是系统工作的线程,守护线程只有在守护对象结束,才退出。
2、设置守护线程,要在start()前

Thread t = new DaemonT();
t.setDaemon(true);

Java中线程的优先级是1-10,线程.setPriority(优先级),设置线程优先级。

2.6 sychronized关键字

1、使用方法,可以用于对象,实例方法,或者静态方法,代码段
2、加锁对象、方法和代码段的原理(略)
3、给静态方法加锁,本质是给当前的类加锁,因此,可访问实例的非静态方法。
4、注意的是,在创建线程中,要注意使用同一把锁。
5、sychronized保证原子性、可见性、有序性(因为每次只有一个线程执行,因此,只要保证串行化语意就能保证执行结果的一致,因此,有序性并不能防止指令重排序,和volatile不同)。
补充:
synchronized有两种形式上锁,一个是对方法上锁,一个是构造同步代码块。他们的底层实现其实都一样,在进入同步代码之前先获取锁,获取到锁之后锁的计数器+1,同步代码执行完锁的计数器-1,如果获取失败就阻塞式等待锁的释放。只是他们在同步块识别方式上有所不一样,从class字节码文件可以表现出来,一个是通过方法flags标志,一个是monitorenter和monitorexit指令操作。

2.7 隐蔽的错误

1、使用线程不安全的容器,如:ArrayList、HashMap等。
2、使用Integer对象i作为锁对象,如果出现i++,则会因为i++会创建Integer对象,将引用赋值给i,导致加锁对象出现不一致。

(二)Java并行程序基础相关推荐

  1. shadowplay要下载java_Java并发程序设计(二)Java并行程序基础

    Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师 链接:https://www.zhihu.com/question/27654579/answer/ ...

  2. Java并发程序设计(二)Java并行程序基础

    Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师 链接:https://www.zhihu.com/question/27654579/answer/ ...

  3. Java并行程序基础(十二)

    2019独角兽企业重金招聘Python工程师标准>>> 无锁 对于并发控制而言,锁是一种悲观策略.它总是假设每一次的临界区操作会产生冲突,因此,必须对每次操作都小心翼翼.如果多个线程 ...

  4. Java并行程序基础

    有关线程 进程是计算机中的程序关于某数据集合上的一次运动活动,是系统进行资源分配的基础单位.进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体. 线程的生命周期 线程的所有状态都在 ...

  5. java面向对象程序基础实验_20165115 实验二《Java面向对象程序设计》实验报告

    20165115 实验二 面向对象程序设计 这一次的实验,老师按照实验内容的不同将实验分成了五个部分进行.五个部分的侧重难易都有区别,实验报告中的叙述也会有所区别. 第一部分 先上实验结果截图: 这一 ...

  6. 《Java高并发程序设计》读书笔记 第二章 并行程序基础

  7. 初识Java ~ (二) # Java 中程序的执行流程,(万字长文)特别细~ 可收藏~

    大家好~ ,我是 清汉 时隔一月,懒惰的我终于将 Java 初识系列文章,第二篇程序执行流程码出来了~ 初识Java ~ (一) 从0开始,Java基础知识,双手奉上~ 可收藏!! 应该不算太晚吧,这 ...

  8. Java面向对象程序基础设计之第三章

    3.1.1 自定义包 如果在程序中没有声明包,类将被存放在default的包中,该方式不被提倡. 语法: package 包名 包命名规范: 包的命名规范应当体现出项目资源良好的划分 自定义标签类所在 ...

  9. Spring Boot –现代Java应用程序的基础

    Spring Boot是Spring.io中一个相对较新的项目. 其目的是简化创建新的基于Spring Framework的项目,并通过应用一些约定来统一其配置. 这种关于配置的方法约定已经成功地应用 ...

最新文章

  1. 三大组件与三大优势 SUSE发布CaaS平台为哪般?
  2. Linux不能上网ping:unknown host问题怎么解决?
  3. Visual Studio .NET 2003 的 一个Bug(2005-5-8)
  4. SpringMVC的概念
  5. 删除链表的倒数第N个节点—leetcode19
  6. ssm后台数据是为什么是空值_网易后台开发实习生面试总结
  7. Num48 boss---02(pdm翻转,持久表现抽取,用户登退,消息提示,修密,自定义拦截器)...
  8. 论文阅读:Natural Language Processing Advancements By Deep Learning: A Survey
  9. 一个对Winsock完成端口模型封装的类
  10. 【UFBA Practice Session for Brazilian ICPC Regionals - 2018】Carnival【强连通图求“关键边”】
  11. 通信协议(二)——SPI协议
  12. 基于JSP的图书销售管理系统
  13. 战舰世界显示无法连接服务器失败,王美雪:战舰世界无法连接服务器解决方法 无法登陆怎么办...
  14. 某易易盾滑块流程加参数分析
  15. EtherCAT运动控制器的PLC编程(一) 直线插补
  16. java经典算法(六)---zws
  17. java http 1.1_HTTP1.1翻译 - 彪悍的人生不需要解释 - BlogJava
  18. 如何彻底的删除hao123_hao123太流氓!怎么从电脑彻底清除?
  19. leetcode 85. Maximal Rectangle(最大矩形)
  20. 偷偷告诉你中国小姐姐的真实Size!!

热门文章

  1. 2022-01-06至10交易记录
  2. 观影坪-纪录片之《穹顶之下》
  3. 季羡林基金会与孔明在线联手弘扬国学文化
  4. python 编程控制键盘和鼠标
  5. electron+vue3+vite2 如何使用打印
  6. 使用JS取得焦点(focus)元素
  7. android 仿微信选取相册_Android类似微信图片选择器
  8. VCS(DVE)调试
  9. matlab中饼图绘制程序,MATLAB中绘制二维饼图的函数是(? ? ) (1.5分)
  10. 计算机网络原理ip计算,计算机网络原理IP地址计算题