最近课上可摸鱼时间较多,因此并发开坑学习
本篇学习自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
包括两个自状态READY
和RUNNING
,前者表示处于改状态的线程可以被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.什么是线程安全
如果一个类在单线程环境下额能够正常运行,并且在多线程环境下,使用方不必为其做任何改变的情况下也能运行正常,那就称其线程安全
线程安全表现在原子性、可见性和有序性
原子性:
说白了就是“不可分割”,对于涉及共享变量的操作,在操作以外的线程看来是不可分割的,那就是原子操作(尽管对于正在执行的线程来说是分很多步骤,但在外界看来该操作要么尚未开始,要么已经结束)
访问同一组共享变量的原子操作是不能被线程交错执行的
原文:https://www.cnblogs.com/caturra/p/10555830.html