javaWeb学习前进吧蜗牛@IT·互联网

java 线程和线程安全初识

2017-06-01  本文已影响449人  cobs

创建线程的两种方法

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

线程的5种状态

状态转换图

注意

这五种状态是我们认知上的五种状态,当然在程序执行中,阻塞状态就有多种类型,
下面是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()之前设置。

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

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

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

volatile关键字

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

提个问题,大家可以想象想,**volatile的应用场景 ** 是什么,可以在评论区讨论哦!请关注微信公众号,查看,嘻嘻。不过以后会在评论区回复的!!

最后,建议大家多手动练练,有时候看的时候,感觉会了,但动起手来,不一定会了。


上一篇文章 java集合类基础和延伸

如有什么不对的地方,欢迎大家指出来,我们共同学习!!
接下来会写关于线程相关的文章,谢谢大家关注

欢迎关注我的微信公众号cobs-snail,让我们一起前进吧!!

前进吧蜗牛
上一篇 下一篇

猜你喜欢

热点阅读