Java多线程

Java多线程的学习笔记
-Java多线程–

讲多线程非常全面清晰,值得收藏的一篇文章:
https://www.cnblogs.com/wxd0108/p/5479442.html


Java多线程最佳实践总结

1、多线程环境,注意共享元素的干涉问题;可以使用同步解决这种冲突,但是同步带来的运行性能的降低
2、多线程环境中,线程对象执行顺序是不确定的,受线程调度器的控制;JVM线程调度是抢占式
3、操作系统中,进程空间相互独立,互不干扰,一个进程可以有若干线程同时执行任务,但至少一个主线程
4、实现Runnable接口可以实现一个自定义线程,但它的启动必须依赖Thread类的start()函数
5、线程启动是start函数,不是run函数,start执行后会立即返回,而不会等待线程结束
6、yield让步,只是提供让步的可能,但是否真的会让步取决于调度器的控制
7、通过main函数启动的Java主线程通常是一个非守护线程,由该线程创建的主线程默认也是非守护的
8、中断 是唤醒阻塞线程的一种手段,线程对象的interrupt函数可以中断sleep阻塞
9、Thread.sleep, wait以及用户的输入打印读写文件等都可能造成阻塞线程
10、线程对象的interrupt函数可以中断阻塞线程,通过Thread.interrupted可以获知被中断的状态,被调用一次就立即复位,再次调用返回false
11、synchronized可以解决共享资源访问冲突问题,保证了共享资源一次只能一个线程访问;synchronized同步不能被interrupt中断
12、运行线程推荐使用 ExecutorService
13、注意同步加锁的对象是否相同,否则不会启动同步作用
14、byte[] lock = new byte[0] 是一个很好的同步锁
15、同步this.getClass()与类名称字面常量class是有区别的,他们不等价
16、同步一个静态方法,它的锁是类的字面常量class,多疑这个锁对该类型起作用(实际上和对象实例无关,只和类型有关,因为函数是static方法)
17、synchronized必须锁定一个对象,修饰函数时,锁是当前对象;修饰代码段时,要指定锁对象
18、int 不可以当做锁,Integer类型的变量则可以当做锁对象
19、通过Collections中的synchronized函数可以将线程不安全的集合类型同步,这样在不改变原有代码的情况下,增加线程安全
20、线程安全的单态设计模式 只需要简单的使用静态的、被初始化本类变量即可
21、原子操作是不可分割的操作,不会受到多线程的影响。i++不是原子操作
22、volatile关键字可以简单获得操作(赋值与返回)原子性,获得共享变量的最新值
23、要使用volatile获得线程安全,必须满足:①对变量的写操作不依赖于当前值,②该变量没有包含在具有其他变量的不变式中
24、wait期间线程阻塞后会释放锁,通过notify会唤醒阻塞线程。sleep阻塞不会释放锁,只能通过中断继续线程;wait/notify提供了一种低成本的轮询操作
25、观察者模式提供了对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并自动更新;Java的事件模型就是观察者模式的具体应用
26、join方法可以使线程等待,直到子线程完成后才继续执行;使用中断可以唤醒阻塞线程;使用不当易造成死锁
27、线程死锁条件:
①访问同步共享对象;②持有一个资源,等待另一个资源;
③资源不能被抢占;④循环等待
28、Executors是一个线程池工厂,是Runnable任务的执行者,ExecutorServcie是线程池的管理者,是Executors的具体实现
29、Executors创建了Fixed, Cashed, Single, Scheduled四类典型线程池方法
30、通过ExecutorServcie中的submit执行提交的Callable任务 可以得到线程执行的返回结果
31、Future可以获得线程运行状态:isDone, isCancelled。可以cancel正在执行的任务,获得返回值时处于的阻塞状态,可以通过中断的方式阻塞状态,也可设置get超时操作,若有返回结果则拿到结果
32、Semophore是一个计数信号量;acquire获取一个许可,release释放一个许可
33、ReentrantLock类似于synchronized,但是它控制的粒度更细,是一个可以被中断的锁
34、Condition来源一个ReentrantLock,提供了await/signal相关操作,使用时必须获得同一个ReentrantLock才有效
35、BlockingQueue提供线程安全的队列集合,它顺序执行多个线程;BlockingQueue如果提取不到元素会持续等待;添加如果满了,也会持续等待可用空间 -->持续处于生产与消费中
36、BlockingQueue添加元素时推荐使用put方法而不是add方法,后者可能不会成功
37、LinkedBlockingQueue是BlockingQueue的具体实现
38、通过CompletionService的submit提交任务,通过take可以异步得到所有已完成线程任务的结果队列;ExecutorCompletionService是CompletionService的具体实现使用了策略模式
39、CountDownLatch可用于等待多个线程协作完成任务返回后,统计归并结果。计数到0之前,主线程持续阻塞,计数到0,线程被唤醒,只能使用一次
40、CyclicBarrier是个可以循环计数的类型,功能和CountDownLatch类似,但是会在达到屏障数值后自动化唤醒所有线程,再次await,自动进入下一轮计数
41、ScheduledExecutorService可以执行在给定的延迟后运行或定期执行任务,使用的时间都是相对时间
42、ConcurrentHashMap是一个线程安全的支持高并发的Map,多线程环境不要使用HashMap;若对于已经存在的老代码,可以使用Collections中的同步集合函数将普通的Map转换成安全的ConcurrentHashMap


(博主原创,转载请注明出处)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值