Java多线程笔记[未更新完]

最近课上可摸鱼时间较多,因此并发开坑学习

本篇学习自Java多线程编程实战指南

目前进展:刚开坑,处于理解概念阶段


Q.进程和线程的区别

进程Process是程序运行的实例,在Java的范畴中,运行一个Java程序的实质是启动一个JVM进程,也就是一个运行的Java程序就是一个Java虚拟机进程(Java Web服务器是一个进程同时运行多个Java Web应用)

进程是程序向操作系统申请资源(内存空间、文件句柄等)的基本单位,而线程Thread是进程中可独立运行的最小单位,一个进程可以包含多个线程,同一个进程中的所有线程共享该进程的资源,

Q.extends Thread 和 Runnable的区别

1.面向对象来看,前者是继承实现,后者是组合实现,因此后者有更低的耦合程度

Java的线程分为守护线程(Daemon)和用户线程,前者用于执行重要性不高的任务,后者反之,且只有当所有用户进程结束后JVM才会正常停止(System.exit调用除外)

Thread的方法

.join() 等待相应进程结束/ yield()当前线程主动放弃处理器的占用

Q.线程的生命周期状态

NEW 已创建而为启动的线程,线程只有一次机会处于该状态

RUNNABLE 包括两个自状态READYRUNNING,前者表示处于改状态的线程可以被Scheduler调度而处于RUNNING。后者表示正在运行(即run正在被处理器执行),可以使用yield()返回到READY。(活跃子状态)

BLOCKED 线程发起阻塞式IO或申请锁(被其他线程占有)时处于该状态,该状态不占用处理器资源。当完成阻塞式IO操作或获得锁时重新回到RUNNALE

WAITING 线程执行特定方法后处于等待其他线程执行另外特定操作的状态。比如Object.wait(),Thread.join(),LockSupport.park(Object)可以获得该状态,返回RUNNABLE的方法有Object.notify()/notifyAll(),LockSupport.unpark(Object)

TIMED_WAITING有时间限制的等待状态,如Thread.sleep(long),Object.wait(long),超时自动返回RUNNABLE

TERMINATED 已经执行结束的进程处于该状态(只有一次),既Thread.run()调用结束、

Q.并发与并行的区别

并行Parallel多个线程在同一时刻处理任务

并发Concurrent单个线程交替的完成不同任务

(书里说的还是不太明确,下次查查别的资料)

竞态指计算的正确性依赖相对时间顺序或者线程的交错,容易产生脏读问题(读取到一个过世的数据、丢失更新)

竞态的模式:read-modify-write(比如a++)和check-then-act(比如对变量的if-else),注意这些都是对于共享变量而言的,局部变量(如形参)不会造成竞态

竞态不一定会造成错误结果,拿上面的模式来说,如果是交错执行read(Thread-0)-read(Thread-1)或者check(Thread-0)-check(Thread-1),很显然结果依然正确

Synchronized使修饰的方法在任一时刻只能被一个线程执行

Q.什么是线程安全

如果一个类在单线程环境下额能够正常运行,并且在多线程环境下,使用方不必为其做任何改变的情况下也能运行正常,那就称其线程安全

线程安全表现在原子性、可见性和有序性

原子性:

说白了就是“不可分割”,对于涉及共享变量的操作,在操作以外的线程看来是不可分割的,那就是原子操作(尽管对于正在执行的线程来说是分很多步骤,但在外界看来该操作要么尚未开始,要么已经结束)

访问同一组共享变量的原子操作是不能被线程交错执行的

猜你喜欢

转载自www.cnblogs.com/caturra/p/10555830.html