java 普通容器,同步容器,并发容器,同步工具
同步容器,如HashTable,提供独占访问。
并发容器,ConcurrentHashMap,有着更好的并发性能,但是不能独占访问。
--putIfAbsent
同步工具:
闭锁:CountDownLatch
FutureTask
Semaphore
栅栏:Barrier
Executor框架:
Executors.newFixedThreadPool()
Executors.newCachedThreadPool()
ExecutorService接口,获取Future运行结果。
CompletionService接口,ExecutorCompletionService,并行运行,并等待结果。
...等
java并没有提供某种抢占式的机制来取消操作或者终结内存,它提供了一种协作式的中断机制来实现取消操作。
当有界队列被填满后,饱和策略开始发挥作用。
--终止策略,抛弃任务,并抛出未受检异常
--调用者运行策略。
--对策略进行修改。
线程工厂ThreadFactory。自定义线程工厂,为新线程指定UncaughtExceptionHandler、定制Thread类用于记录信息等。
定制和扩展ThreadPoolExcutor。
--定制:自定义线程池大小、存活时间、线程工厂、饱和策略等。
--扩展:beforeExecute(),afterExecute和terminate()。可以添加计时、日志、统计和信息收集功能。
stream并行处理,CompletableFuture
关闭和取消:
1. 如何好的关闭一个任务?
任务和线程是独立的,也就是说线程运行任务,但是关闭任务并不意味着退出线程。
a)stop()函数----@Deprecated。已经弃用,因为强制退出线程,会造成很多无法预料的错误。
* @deprecated This method is inherently unsafe. Stopping a thread with
* Thread.stop causes it to unlock all of the monitors that it
* has locked (as a natural consequence of the unchecked
* <code>ThreadDeath</code> exception propagating up the stack). If
* any of the objects previously protected by these monitors were in
* an inconsistent state, the damaged objects become visible to
* other threads, potentially resulting in arbitrary behavior. Many
* uses of <code>stop</code> should be replaced by code that simply
* modifies some variable to indicate that the target thread should
* stop running. The target thread should check this variable
* regularly, and return from its run method in an orderly fashion
* if the variable indicates that it is to stop running. If the
* target thread waits for long periods (on a condition variable,
* for example), the <code>interrupt</code> method should be used to
* interrupt the wait.
b)使用共享变量。
在遇到阻塞等待时,就失去效果了。
https://stackoverflow.com/questions/10961714/how-to-properly-stop-the-thread-in-java
c)使用中断。
需要任务代码的支持,只能解决抛出InterruptedException异常的阻塞,如果任务代码不支持或者如IO阻塞等,也失去了效果。
d)处理不可中断的阻塞。
自己实现Thread的继承类,重写interrupt()函数,自行关闭阻塞的函数,如关闭IO连接等。
http://www.cnblogs.com/simbachen/p/4009562.html
总结:如果写多线程程序时,需要考虑提前结束的情况,那么要有任务代码的支持。任务代码必须要考虑如何响应中断,如何提前关闭,而不是只考虑计算逻辑等待线程被强制结束。
因为强制结束会有很多不确定因素,比如可能部分修改了对象中的变量,标志位没有恢复,IO未关闭等。
ps. 对继承的认识有了提高,以前觉得继承只是为了继承一些属性和行为,现在发现可以做的事情很多,可以扩展行为,可以改变行为。
处理非正常的线程终止:捕获RuntimeException。
未捕获异常的处理:继承UncaughtExceptionHandler,有点像spring中的ExceptionHandler;ThreadGroup。
钩子:通过Runtime.getRuntime().addShutdownHook()注册。当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。
同一个JVM最好只使用一个关闭钩子,而不是每个服务都使用一个不同的关闭钩子,使用多个关闭钩子可能会出现当前这个钩子所要依赖的服务可能已经被另外一个关闭钩子关闭了。为了避免这种情况,建议关闭操作在单个线程中串行执行,从而避免了再关闭操作之间出现竞态条件或者死锁等问题。
http://www.cnblogs.com/zhuawang/p/4523503.html
守护线程,非守护线程:

考虑多线程的代价。
1. 死锁
2. 性能。上下文切换,内存同步,阻塞。
3. 锁的竞争。锁分段,锁分解。
测试多线程。
1. 贴近真实场景
2. 线程执行的不确定性。
3. 使用 回调函数 或者 扩展类 获取信息。
4. 考虑垃圾回收、动态编译/编译优化的影响。
ReentrantLock、ReadWriteLock和synchronized内置锁
1. ReentrantLock实现Lock接口,更丰富,提供定时的锁等待、可中断的锁等待、公平性选择。但是是互斥的。
2. synchronized编写简单,出代码块时自动unlock。
3. 读写锁ReadWriteLock。可选读优先/写优先,多个读一个写。
java更底层的同步机制
synchronized和wait/notify/notifyAll结合使用,注意“过早唤醒”和“信号丢失”情况。
Condition,更细分等待线程。
悲观锁--独占性,lock
乐观锁--CAS(会有ABA问题)
安全的发布/不安全的发布:缺少happens-before关系时,会出现重排序现象。
java 普通容器,同步容器,并发容器,同步工具的更多相关文章
- Java编程的逻辑 (74) - 并发容器 - ConcurrentHashMap
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- Java编程的逻辑 (73) - 并发容器 - 写时拷贝的List和Set
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- Java进阶知识点6:并发容器背后的设计理念 - 锁分段、写时复制和弱一致性
一.背景 容器是Java编程中使用频率很高的组件,但Java默认提供的基本容器(ArrayList,HashMap等)均不是线程安全的.当容器和多线程并发编程相遇时,程序员又该何去何从呢? 通常有两种 ...
- 多线程同步与并发访问共享资源工具—Lock、Monitor、Mutex、Semaphore
“线程同步”的含义 当一个进程启动了多个线程时,如果需要控制这些线程的推进顺序(比如A线程必须等待B和C线程执行完毕之后才能继续执行),则称这些线程需要进行“线程同步(thread synchro ...
- java多线程系列五、并发容器
一.ConcurrentHashMap 1.为什么要使用ConcurrentHashMap 在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,HashMap在 ...
- Java编程的逻辑 (76) - 并发容器 - 各种队列
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- Java编程的逻辑 (75) - 并发容器 - 基于SkipList的Map和Set
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- 《java并发编程实战》读书笔记4--基础构建模块,java中的同步容器类&并发容器类&同步工具类,消费者模式
上一章说道委托是创建线程安全类的一个最有效策略,只需让现有的线程安全的类管理所有的状态即可.那么这章便说的是怎么利用java平台类库的并发基础构建模块呢? 5.1 同步容器类 包括Vector和Has ...
- Java并发编程:并发容器ConcurrentHashMap
Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...
- 【Java并发工具类】Java并发容器
前言 Java并发包有很大一部分都是关于并发容器的.Java在5.0版本之前线程安全的容器称之为同步容器.同步容器实现线程安全的方式:是将每个公有方法都使用synchronized修饰,保证每次只有一 ...
随机推荐
- mobiscroll的例子
官网:https://docs.mobiscroll.com/4-3-2/jquery/datetime#options ............. <!DOCTYPE html>< ...
- thinkphp --- 写入日志
在开发过程中,对于一些参数,不好直接输入或者打印调试,特别是在微信开发过程中,这个时候,通过日志来查看信息就显得格外重要. 下面是在TP3.2.3框架中,写入日志的方法: public functio ...
- Linux系统下 Supervisor 安装搭建
在 web 应用部署到线上后,需要保证应用一直处于运行状态,在遇到程序异常.报错等情况,导致 web 应用终止时,需要保证程序可以立刻重启,继续提供服务. 所以,就需要一个工具,时刻监控 web 应用 ...
- 170712、springboot编程之集成shiro
这篇文章我们来学习如何使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求.在Java领域一般有Spring Security ...
- Hibernate的状态,缓存和映射
Hibernate的状态,缓存和映射 1.对象的状态 1.1.对象状态的概念和分类 在使用Hibernate操作数据库的时候,我们先创建了JavaBean对象,然后使用session来保存或者更新到数 ...
- as modern frameworks have warmed people to the idea of using builder-type patterns and anonymous inner classes for such things
mybatis – MyBatis 3 | SQL语句构建器 http://www.mybatis.org/mybatis-3/zh/statement-builders.html SqlBuilde ...
- 数据去重优化 MemoryError 内存不足
from ProjectUtil.usingModuleTOMODIFY import getNow export_q_f, q_l, start_ = '/mnt/mongoexport/super ...
- Bungee Jumping---hdu1155(物理题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1155 题目很长,但是很容易理解,就是人从高s的桥上跳下来,手拉着长为l的绳子末端,如果绳子太短那么人将 ...
- 【我的Android进阶之旅】解决Android Studio 运行gradle命令时报错: 错误: 编码GBK的不可映射字符
1.问题描述 最近在负责公司基础业务和移动基础设施的开发工作,正在负责Lint代码静态检查工作.因此编写了自定义的Lint规则,在调试过程中,编译的时候出现了如下所示的错误: 部分输出日志如下所示: ...
- React Native入门-刘望舒
React Native入门(一)环境搭建与Hello World React Native入门(二)Atom+Nuclide安装.配置与调试 React Native入门(三)组件的Props(属性 ...