- 进程与多线程的:
- 进程即一个正在运行的应用,一个进程可以有多个线程但必有一个主进程。
- 线程是进程中独立运行的子任务。
- Thread类
- sleep 方法,休眠,不释放资源 --进入阻塞状态
- yield 放弃当前cpu资源 --切换就绪状态
- join 等待前一线程执行完毕 --进入阻塞状态
- Object.wait 则释放资源
- interrupt 中断
- Thread.interrupted 判断当前线程是否已经中断
- new Thread.isInterrupted 该判断线程是否已经中断
- stop暴力停止,Deprecated方法
- suspend与resume方法暂停线程,Deprecated方法
- setPriority 设置优先级,但优先级并不代表一定优先执行。
- volatile
- 确保了数据存取的原子性(32位环境读取64位变量分两次,先读高32位后读低32位)
- 保证了数据的可见性
- 禁止了指令重排序
误区:- 自增操作(i++) 不具备原子性,即本操作是三步
- 从主存储中读取i的值到高速缓存
- 在高速缓存中对i进行算数运算
- 将结果从高速缓存写入主存储
- 不具有原子性的操作volatile无法保证其准确性
- 当a线程读取i并进行加法运算,此时b线程进行读取i操作,此时a并未将i写入主存储,所以b读到的还是旧的值。
- 自增操作(i++) 不具备原子性,即本操作是三步
- 想保证上一操作的原子性则需要在运算方法上加入synchronized关键字,或者使用Lock 对象锁的方式来保证同一时间仅有一个线程可以调用该方法。或是使用原子对象自增AtomicInteger.
- 守护线程Daemon:当进程中没有非守护县城则守护线程也被摧毁。典型应用就是GC。
网友评论