java并发
2017-01-01 13:02:14 0 举报
AI智能生成
Java并发是指Java语言中多线程的编程技术。在Java中,每个线程都有自己的执行路径,可以同时执行多个任务。这种技术可以提高程序的效率和响应速度,但也会带来一些问题,如数据竞争、死锁等。为了解决这些问题,Java提供了一些并发工具类,如synchronized、ReentrantLock、Semaphore等。此外,Java还提供了一些高级的并发框架,如ExecutorService、Future、Callable等,可以帮助开发者更好地管理线程和任务。总之,Java并发是一种强大的编程技术,可以帮助开发者编写高效、可靠的多线程程序。
作者其他创作
大纲/内容
volatile
直接读写主存而不是cpu cache
解决可见性问题
happen-before 保证
对volatile变量写的时候,会将此线程所有已经发生变动的变量值flush到主存
对volatile变量读的时候,会将本线程所有变量从主存读一遍
volatile变量的读写不能乱序
happen-before
如果操作A先行发生于操作B,其意思就是说,在发生操作B之前,操作A产生的影响都能被操作B观察到。影响包括:修改了共享变量的值,发送了消息,调用了方法,它与时间上的先后发生没有太多关系
8条规则
在同一个线程中,按照程序代码的执行顺序,时间上先执行的操作happer-before时间上后执行的操作
对同一个锁的unlock操作happen-before lock操作
传递规则
volatile规则
线程启动规则:Thread对象的start方法happen-before此线程的每一个操作
线程中止规则:线程的所有操作happen-before 对此线程的终止操作,如: Thread.join()方法结束,Thread.isAlive() 返回值
线程中断规则:对线程interrupt()方法的调用happen-before 被中断线程检测到中断事件
对象终结规则:一个对象的初始化完成happen-before finalize()方法的开始
锁
synchronized
jvm会在修饰的代码块前后加monitorenter,monitorexit字节码
阻塞和唤醒需要操作系统的协助,从用户态切换到内核态
可重入
非公平锁
不可中断性
乐观锁CAS
Unsafe
分配内存
释放内存
定位对象某字段的位置
修改对象的值
硬件级别的CAS
AQS
提供一个模板让开发者使用继承的方式来实现一个同步器。将重复,容易出错的队列管理工作抽象出来,暴露给子类管理共享状态的方法,如: setState(), getState(), compareAndSetState()
面向线程和状态控制,定义了线程获取状态的机制和线程排队的机制。核心是管理一个共享状态,通过对状态的控制来实现不同的锁机制
对于独占模式,提供了acquire(), release()方法来实现锁获取和释放,子类需要实现tryAcquire(), tryRelease()
集合类
ConcurrentHashMap
get方法不需要加锁
put方法
定位segment
判断segment是否需要扩容
扩容时先创建一个2倍的数组,然后对原来的元素再hash后插入新数组
定位添加元素的位置,然后放在HashEntry数组中
size方法,先尝试2次不锁的方式统计各segment大小,如果segment的modCount发生过变化,则对全部的segment加锁再统计
Future
接口中的方法
cancel
isCancelled
isDone
get
实现类
FutureTask
客户端调用get方法时,如果result没有准备好,加入到waiter链表中,然后通过LockSupport.park()休眠
run方法跑出最终结果后,修改状态为已完成,唤醒waiter链接中的线程
0 条评论
下一页