前言
写这一专栏目的是为了复习多线程与高并发的知识体系,由于是为了捡起来丢掉的东西,所以笔者写的都是关键的一些东西,并没有详细去阐述,对于新手不是很友好,对于有基础的程序员可以从中窥一而知全貌。这是学习的一个非常好的方法。
线程的相关概念
线程:一个程序里不同的执行路径。
线程的启动方式:
- extends Thread
- implements Runnable
- new Thread(new myrun().start())
- Executors.newCachedThread
线程的3个方法
sleep,yeild,join
线程的状态
new,Runnable(ready,Running),TimedWaiting,Waiting,Blocked,Terminated
锁的相关概念
锁具有可重入性。
线程同步synchronized
不能用String常量,Integer Long
- 锁的是对象不是代码
- this xx.clas
- 锁定方法 非锁定方法 同时执行
异常与锁
程序在执行过程中,如果出现异常,默认情况锁会被释放
所以,在并发处理的过程中,有异常要多加小心,不然可能会发生不一致的情况。
比如,在一个web app处理过程,多个servlet线程共同访问同一个资源,这时如果异常处理不合适,
在第一个线程中抛出异常,其他线程就会进入同步代码区,有可能会访问到异常产生时的数据。
因此要非常小心的处理同步业务逻辑中的异常。
synchronized的底层实现
JDK早期的 重量级 - OS
后来的改进:锁升级(改进的地方到底在哪里?)
当使用synchronized去访问某线程时sync(Object),先在Object的markword记录这个线程(只是记录这个线程ID(偏向锁),没有加锁)。
如果有线程争用:升级为自旋锁
10次以后,升级为重量级锁 - OS
思考:锁能降级吗?