关于synchronized
同步方法:当它锁的是一个方法的时候,当第一个线程调用该方法时候,锁住,这样第二个线程必须等第一个线程调用完后(也就是该方法return后),才能再调用。
同步块:注意监视的对象是需要增删改查的对象
第一个线程访问,锁定同步监视器,执行其中代码
第二个线程访问,发现同步监视器被锁定,无法访问
第一个线程访问完毕,解除同步监视器
第二个线程访问,发现同步监视器没有锁,执行其中代码
P22 死锁
某一个同步块同时有两个以上对象的锁,就可能出现死锁
通俗来讲,两个线程都在等待对方释放资源,例如线程A拥有资源a,B拥有b,线程A想要资源b,而B想要a,这个时候AB都在等待对方先释放资源,然后就会停止执行。
产生死锁的四个必要条件:
1.互斥条件:一个资源每次只能被一个进程使用。
2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
女1线程,先获得口红,3秒后想获得镜子,女2线程,先获得镜子,2秒后想获得口红。这里的2秒3秒保证了两个线程都先获得一个基本资源,女1:口红;女2:镜子,后面就开始想获取对方的资源,然后就会卡死
解除方法,把同步块拿出来,不同时获得两把锁
P23 lock锁
不加锁
加锁(解除注释)
P27线程池
比较简单的创建方式:
TimeUnit时间单位
ThreadFactory 用来增加线程
当任务进来
先看核心线程是否满
1,没满开始执行;2,满了就看任务队列
再看任务队列
- 没满添加到队列中;2,满了看最大线程
看最大线程
1,没满,增加线程数来执行任务;2,满了,看拒绝策略