没有合适的资源?快使用搜索试试~ 我知道了~
java多线程编程
资源推荐
资源详情
资源评论
1 多线程并发扩展
1.1 死锁
两个或两个以上的进程在执行中,因争夺资源而造成的一种户想等待的情况。
如果没有外力作用,此时将没法推进下去,系统将产生死锁。
1.1.1 死锁—必备条件
1、互斥条件:进程对所分配的资源进行排他性的使用,也就是某段事件资源只能被一个进程使用。
如果有其他进程希望使用,请求者只能等待。
2、请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被
其他资源占用,此时请求进程阻塞,但又对自己已获得的其他资源不放。
4、不剥夺条件:进程已获得的资源在未使用完之前,不能被剥夺,只能在使用完的时候自己释放。
5、环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的 P0 正在等待
一个 P1 占用的资源;P1 正在等待 P2 占用的资源,……,Pn 正在等待已被 P0 占用的资源。
1.1.2 死锁代码案例
/**
* 一个简单的死锁类
* 当 DeadLock 类的对象 flag=1 时(td1),先锁定 o1,睡眠 500 毫秒
* 而 td1 在睡眠的时候另一个 flag==0 的对象(td2)线程启动,
* 先锁定 o2,睡眠 500 毫秒
* td 睡眠结束后需要锁定 o2 才能继续执行,而此时 o2 已被 td2 锁定;
* td2 睡眠结束后需要锁定 o1 才能继续执行,而此时 o1 已被 td1 锁定;
* td1,td2 相互等待,都需要得到对方锁定的资源才能继续执行,从而死锁。
* @author tangxiaochun
*
*/
public class DeadLock implements Runnable{
public int flag=1;
//静态对象是类的所有对象共享的
private static Object o1=new Object();
private static Object o2=new Object();
public void run(){
System.out.println("======flag====="+flag);
if(flag==1){
synchronized (o1) {
try {
Thread.sleep(500);
} catch (Exception e) {
System.out.println("=====程序异常=====");
}
synchronized(o2){
System.out.println("1");
}
}
}
if(flag==0){
synchronized (o2) {
try {
Thread.sleep(500);
} catch (Exception e) {
System.out.println("=====程序异常=====");
}
synchronized(o1){
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
DeadLock td1=new DeadLock();
DeadLock td2=new DeadLock();
td1.flag=1;
td2.flag=0;
//td1,td2 都处于可执行状态,但 JVM 线程调度先执行
//那个线程时不确定的。
//td2 的 run()可能在 td 的 run()之前运行
new Thread(td1).start();
new Thread(td2).start();
}
}
1.2 多线程并发最大实战
1、使用本地变量:尽量使用本地变量,而不是创建一个类或者是实例变量,通畅情况开发人员
使用对象实例作为变量,可以节省内存并且可以重用。应为创建本地变量会很消耗内存。
2、使用不可变类:降低代码中的同步数量
3、最小化锁的作用域范围:S=1/(1-a+a/n)
https://baike.baidu.com/item/%E9%98%BF%E5%A7%86%E8%BE%BE%E5%B0%94%E5%AE%9A%E5%BE%8B/10386960?fr=aladdin
4、使用线程池的 Executor,而不是直接 new Thread 执行。
5、宁可使用同步也不要使用线程的 wait 和 notify。
6、使用 BlockingQueue 实现生产-消费模式(可以处理多个生产和多个小费)
7、使用并发集而不是加了锁的同步集合(即是同步锁的集合)
8、使用 Semaphore 创建有界的访问:为了简历可靠的,稳定的系统对于数据库文件系统、
Scoket 的等资源,必须做有界的访问,Semaphore 可以限制这些资源开销的选择。
如果宝贵的资源不可以范文,可以使用 Semaphore 可以直接阻塞,使线程等待。
也可以通过 Semaphore 控制访问某一资源的线程数。
9、宁可使用同步代码块,也不使用同步的方法:主要针对 synchronized 关键字,使用 synchronized
同步代码块只会锁定一个对象,而不会将整个方法锁定,
10、避免使用静态变量:静态变量在并发执行下,会出现很多的问题,
如果使用 static 变量,优先让其成为 final 变量,如果是修饰 collection,优先
成为只读集合,否则需要做同步处理和并发处理。
1.3 spring 与线程安全
spring 为我们管理了很多的 bean,但是 spring 并没有保证这些对象的安全。需要由开发者自己解决
线程安全,spring 为每个 bean 提供了一个 scope 属性,限制 bean 的作用域。
singleton:单例,在首次注入的时候,创建单例对象,并持续到应用结束。
prototype:在每次注入时都会创建一个对象。
spring bean:singleton,prototype
另外:我们交给 spring 管理的大多是无状态对象
无状态对象:https://mp.weixin.qq.com/s/70Kl4kX9gax5wyaHHiOlKA
无状态的对象不管是单例还是多例,都是线程安全的。
1.4 HashMap 与 ConcurrentHashMap 解析
java 中常用的两种数据结构:数组和指针(引用),
HashMap 底层就是数组结构,数组的每一项又是一个链表,
HashMap 的寻址方式:
HashMap 是线程不安全的:
【单线程下的 reHash】
剩余23页未读,继续阅读
资源评论
雾林小妖
- 粉丝: 1w+
- 资源: 90
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功