Java多线程基础
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java多线程基础,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3229字,纯文字阅读大概需要5分钟。
内容图文
同步方式
1、将所有可变状态封装在对象内部,并通过对象内置锁对所有访问可变状态的代码路径进行同步。
2、监视器模式:把对象所有可变状态封装起来,并由对象自己的内置锁来保护。
3、委托:如:Collections.synchronizedList(new ArrayList<>());
常用对象
一、volatile变量
1、不会将变量上的操作与其它内存操作一起重排序,不会被缓存在寄存器或其它处理器不可见的地方,因此读取volatile类型变量时总放回最新写入的值。
2、只能保证可见性,通常用作简单的状态标识。
二、ThreadLocal
1、使线程中的某个值与保存值的对象关联起来,使用某个变量的线程都存有一份独立的副本。
2、线程值保存在Thread对象中。
三、Future
1、表示任务的生命周期
2、get方法任务时阻塞的
TimeoutException:超时
InterruptedException:任务被中断
ExecutionException:任务抛出异常会被封装成ExecutionException抛出
3、cancel方法
true:会中断线程停止任务。
false:如果任务还没执行会中断任务,如果任务已经开始执行会让任务执行下去。
四、ExecutorCompletionService
1、作用:提交了一组计算任务,得到其中完成了的任务。
五、Thread
1、interrupt:中断线程(并不意味着立即停止目标线程正在进行的工作,只是传递了请求中断的消息)
2、isInterrupted:目标线程中断状态
3、静态的interrupted:清除当前线程的中断状态(清除中断状态的唯一办法),并返回它之前的值。
4、sleep()等阻塞方法,发现中断时会提前返回,并会清除中断状态,抛出InterruptedException。
5、join():线程执行join方法后,只有改线程任务执行完后,才会执行接下来的代码。
6、UncaughtExceptionHandler通过这个来捕获运行时异常。
并发容器
一、ConcurrentHashMap
1、分段锁
2、size和isEmpty被弱化,如:size方法返回的是一个估计值。
二、CopyOnWriteArrayList
1、每次修改时,都会创建并重新发布一个新的容器副本。
线程池
一、ExecutorService
1、shutdown:不再接受新任务,等待已经提交的任务执行完成(包括还未开始执行的任务)
2、shutdownNow:取消所有运行中的任务(不再启动队列中还没开始执行的任务)
3、invokeAll:提交一组任务,若超时,还没有完成的任务会被取消;
疑问
1、线程栈的地址空间
2、DelayQueue
3、句柄
4、套接字
5、newtaskfor
6、关闭钩子的使用 Runtime.getRuntime().addShutdownHook()
基础
一、概念
1、发布:是对象能在当前作用域以外的代码中使用,如其它对象中使用该对象的引用。可能破坏安全性。
2、逸出:不该发布的对象发布了。
3、线程封闭:仅在单线程内访问数据,不需要同步。局部变量和ThreadLocal,但需要确保封闭在线程中的对象不会从线程中逸出。
4、ad-hoc线程
5、对象不可变
- 对象创建后状态不能修改
- 对象所有域都是final类型
- 对象正确创建(this引用没有逸出)
6、安全发布
- 静态初始化函数中初始化对象引用
- 对象引用保存在volatile类型域或AtomicReferance对象中
- 对象引用保存在正确构造对象的final域中
- 对象引用保存在由锁保护的域中(如:Vector)
二、注意点
1、执行时间较长的计算,不要持有锁。(如:网络IO)
2、非volatile类型的long和double变量,JVM允许将64位的读或写操作分解为两个32位的操作。
3、不要在this引用中使构造函数逸出。
4、每个线程都会维护两个执行栈,一个用于Java代码一个用于原生代码,JVM默认情况会生成一个复合栈,约0.5MB;
5、大量独立且同构的任务并发处理时,多线程才能使性能真正的提升。明确任务边界;分析粒度更细的并行性;
6、Socket IO或等待内置锁而阻塞,中断线程只能设置线程的中断状态,别无它用。
三、其它
1、安全性
2、原子性
3、内存可见性
4、posix线程
5、每个对象都有一个内置锁
6、重排序:编译器操作顺序重排序,并将数值缓存在寄存器中;CPU处理器特定的缓存中。
7、不希望ExecutorService被暴露出去但不希望其被修改时,可用Executors.unconfigurableExecutorService()将其封装起来
内容总结
以上是互联网集市为您收集整理的Java多线程基础全部内容,希望文章能够帮你解决Java多线程基础所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。