文档章节

java 线程和线程安全初识

SKYCOBS
 SKYCOBS
发布于 2017/06/01 08:18
字数 1017
阅读 11
收藏 0
点赞 0
评论 1

创建线程的两种方法

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

线程的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() 比较标准

volatile关键字

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

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

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


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

前进吧蜗牛

© 著作权归作者所有

共有 人打赏支持
SKYCOBS
粉丝 8
博文 105
码字总数 19280
作品 0
呼和浩特
程序员
加载中

评论(1)

SKYCOBS
SKYCOBS
volatile的应用场景

对变量的写操作不依赖于当前值
该变量没有包含在具有其他变量的不变式中

使用场景
①.状态标记量
②.单例模式中的double check
【每周一讲】Java的ThreadLocal

1、初识她 她到底是谁? 姑且先看个例子。 public interface Counter { /** * 获取下一个序列值 * @return */ int getNextNum();} public class SimpleCounter implements Counter { privat......

ulyn
2015/08/16
0
0
java面试必备之ThreadLocal

按照传统的经验,如果某个对象是非线程安全的,在多线程环境下对象的访问需要采用synchronized进行同步。但是模板类并未采用线程同步机制,因为线程同步会降低系统的并发性能,此外代码同步解...

编程老司机
05/16
0
0
ThreadLocal 基础知识

ThreadLocal是什么 · 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ...

向阳而生
2015/11/21
0
0
理解ThreadLocal 2

摘自《Spring 揭密》 王福强著 人民邮电出版社 1 ThreadLocal的背景 单单从程序层面来看,我们编写的代码实际上是在管理系统中各个对象的相关状态,如果不能对各个对象的状态的访问进行合理的...

i33
2012/03/22
0
0
[转]理解ThreadLocal

ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 Th...

inferrrrrr
2009/11/03
0
0
转:理解ThreadLocal

ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 Th...

轮回今生
2012/10/26
0
0
threadlocal原理分析

简介 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。当使用ThreadLocal...

mrliuze
2015/08/11
0
0
ThreadLocal趣谈 —— 杨过和他的四个冤家

一个一个上 一日醒来,杨过发现小龙女离家出走,于是外出寻找,不料碰上了金轮法王、李莫愁、裘千尺、公孙止四个冤家。 “哼,四个打我一个,算什么英雄好汉,有本事的,一个一个上!” 按照...

SexyCode
06/12
0
0
多线程——彻底理解ThreadLocal

ThreadLocal是什么   早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。...

亚特兰缇斯
2015/03/16
0
0
java类ThreadLocal的理解

ThreadLocal是什么 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更...

保罗的寓言
2011/05/21
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Nested enum types are implicitly static

.Nested enum types are implicitly static So there's no need to declare them static explicitly....

Yixin_Nemo
10分钟前
0
0
xlsxwriter 常用excel格式

官方文档:xlsxwriter 官方文档 微博只对常用的方法做了总结和coding,详细方法请参考官方文档 常规写入数据: 写入字符串write_string() import xlsxwriterworkbook = xlsxwriter.Workb...

白木日勿
10分钟前
0
0
TeX

Ito LaTeX是一类用于编辑和排版的软件,用于生成PDF文档。 LaTeX编辑和排版的核心思想在于,通过\section和\paragraph等语句,规定了每一句话在文章中所从属的层次,从而极大方便了对各个层次...

E-C-Ares
12分钟前
0
0
nodejs调用webservice接口

刚接触花了一天时间去查找资料,网上资料也是够了,很多都试了不行,最后看了还是那么简单 主要是了node-soap node-soap-ntlm soap-ntlm-2,这几个试了都有缺陷, 1 首先安装soap npm instal...

lovelan1314
13分钟前
0
0
SUSE Linux 将被 EQT 收购

SUSE再次易主 Micro Focus 宣布将其一大部分业务出售给瑞典私人股本集团殷拓(EQT),所得的一部分收益将用来减轻债务,其余部分将返给股东。EQT 是一家专注于开发领域的投资公司,在软件行业拥...

linux-tao
21分钟前
0
0
Elastic-Job定时任务

用Elastic-Job可解决分布式重复执行问题 如果业务工程采用集群化的部署,可能会多次重复执行定时任务而导致系统的业务逻辑错误,并产生系统故障。 job.properties simple.id=recommendJobs...

lsjlgo
22分钟前
1
0
Markdown文件导出为pdf

1. 安装VSCode插件 打开VSCode,按F1 输入ext install,选择安装扩展 搜素markdown pdf,安装插件 2. 编辑.md文件 后缀名为.md ### 1. 表格---| 1 | 2 | 3 || --- | --- | --- || a | b...

影狼
23分钟前
0
0
redis加入到Windows 服务

redis加入到Windows 服务 安装命令: redis-server.exe --service-install redis.windows.conf --loglevel verbose 卸载命令: redis-server --service-uninstall...

轩辕剑
27分钟前
0
0
springboot--如何优雅的使用mybatis

这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis。到网上找了一下关于spring boot和myb...

迷你芊宝宝
28分钟前
0
0
JEESZ 分布式框架开发环境部署

1. 环境准备 1. 开发工具: Eclipse IDE(建议使用高一点的版本) 2. JDK 版本:JDK1.7 3. 项目管理: Maven3.1.1 2. 安装步骤 1. 安装 jdk1.7 并配置环境变量(相信大家都会做,这里不再做重...

明理萝
29分钟前
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部