java 线程和线程安全初识

建立线程的两种方法

继承Thread类或实现Runnable接口。都是重写了 run() 方法。 执行线程都是用Thread类的start()方法。java

线程的5种状态微信

  • 新建状态(New):线程对象被建立后,就进入了新建状态。eg,Thread = new Thread();
  • 就绪状态(Runnable):又称可执行状态。线程对象建立后调用了start() 方法启动线程
  • 运行状态(Running):线程获取CPU进行执行。只能从就绪状态进入运行状态。
  • 阻塞状态(Blocked):因某种缘由放弃CPU使用权,暂时中止运行。缘由有三种:
    • 等待阻塞 --> 经过调用线程的wait()或sleep()或join()方法,让线程等待某工做完成。
    • 同步阻塞 --> 线程在获取synchronized同步锁失败(被其余线程占用)
    • 其余阻塞 --> 经过调用线程的发出了I/O请求时,线程会进入同步阻塞状态
  • 死亡状态(Dead):线程执行完了或异常退出了run()方法。结束生命周期

状态转换图

注意

这五种状态是咱们认知上的五种状态,固然在程序执行中,阻塞状态就有多种类型, 下面是java源代码中的六种状态并发

  1. NEW 在执行start()方法以前
  2. RUNNABLE 执行或等待资源
  3. BLOCKED 线程在等待monitor锁(synchronized 关键字)
  4. WAITING Object.wait() 和 Thread.join() 和 LockSupport.park() 方法会形成这种等待阻塞
  5. TIMED_WAITING 暂且叫限时等待,是上面方法加了一个等待时间,或者LockSupport的其余方法
  6. TERMINATED 终止状态·

线程能够设置为守护线程,但必须在调用 start()以前设置。优化

经常使用的同步类(不知道合适不合适)

  • CountDownLatch 一般用来使主线程等待其余线程执行完再执行所用到
  • ReentrantLock 并发时,它增长了一些synchronized没有的方法,更方便管理
  • synchronized 简单的同步就用这个吧

interrupt()和 interrupted()和 isInterrupted() 区别

  • 当某个线程调用了interrupt()方法后,至关于给该线程打上了一个中断标志,若是线程正好处于阻塞状态,会直接抛出InterruptedException 异常
  • interrupted()方法用来检测“当前线程”的中断状态,且会将中断状态标志清除
  • isInterrupted()方法用来检测“this”的中断状态,且不会改变线程的状态标志。

获取线程终端状态 要用Thread.currentThread().isInterrupted() 比较标准this

volatile关键字

  1. volatile保证可见性 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰以后,那么就具有了两层语义: 1)保证了不一样线程对这个变量进行操做时的可见性,即一个线程修改了某个变量的值,这新值对其余线程来讲是当即可见的。 2)禁止进行指令重排序。
  2. volatile不能确保原子性
  3. volatile保证有序性 在前面提到volatile关键字能禁止指令重排序,因此volatile能在必定程度上保证有序性。 volatile关键字禁止指令重排序有两层意思: 1)当程序执行到volatile变量的读操做或者写操做时,在其前面的操做的更改确定所有已经进行,且结果已经对后面的操做可见;在其后面的操做确定尚未进行; 2)在进行指令优化时,不能将在对volatile变量的读操做或者写操做的语句放在其后面执行,也不能把volatile变量后面的语句放到其前面执行。

提个问题,你们能够想象想,**volatile的应用场景 ** 是什么,能够在评论区讨论哦!请关注微信公众号,查看,嘻嘻。不过之后会在评论区回复的!!线程

最后,建议你们多手动练练,有时候看的时候,感受会了,但动起手来,不必定会了。对象


欢迎关注个人微信公众号cobs-snail,让咱们一块儿前进吧!!排序

前进吧蜗牛

相关文章
相关标签/搜索