Day 12 synchronized和Lock的学习
Day12
多线程学习
同步方法及同步块
方法锁synchronized可以保证线程的同步。
形成原理就是队列和锁
在方法前加synchronized关键字这个方法就是同步方法,没有加就不安全。
synchronized控制对象的访问,每一个对象都有一把锁,synchronized方法必须调用该对象的锁才能执行,不然就会堵塞。
方法里面锁,很多内容都需要锁导致效率很低,可以只在修改的代码上锁就需要同步块。
synchronized默认锁的this,要锁变换的量,
同步块 synchronized(变化的量){
}
这个变化的量也叫obj,是需要增删改的对象
CopyOnWriteArrayList JUC
这个数组就是本身安全的,属于并发编程的数组,很安全不需要再加方法锁来保证安全了
是一个数组的用法。
死锁
多个线程同时对一个资源操作时,会出现导致两个或多个都在等待对方释放资源,都停止运行的情况,某一个同步块拥有两个或以上多个锁时,就可能发生死锁问题。
用static来保证只有一份资源。
这些操作系统都讲过,概念比较好理解。
产生死锁的四个必要条件
- 互斥条件
- 请求与保持条件
- 不剥夺条件
- 循环等待条件
只要破坏一个条件或多个条件就能避免死锁的发生。
Lock锁
也是JUC包下的,属于并发编程的。
可重入锁 ReentranLock 实现了Lock类
Lock类拥有了与synchronized相同的并发性和内存语义。
while (true)
{
try {
lock.lock();
if (ticketnums>0)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(ticketnums--);
}
else
{
break;
}
}finally {
lock.unlock();
}
synchronized和lock的对比
lock是显式锁,需要手动开启和关闭,而synchronized是隐式锁,出了作用域自动释放。
lock只有代码块锁,synchronized不仅有代码块锁还有方法锁。
使用lock锁,JVM将花费更少的时间来调度线程,性能更好,并且具有更好的拓展性。
优先使用顺序 Lock>同步代码块>同步方法
思考
学习了两种锁,一种是synchronized关键字的锁,一种是Lock类的锁,相比来说,Lock类的锁我更容易接受,是通过一个类的方法来保护程序代码块,但是Lock锁不能保护方法,不能同步方法上。整的来说,关于死锁机制和锁机制,在学习操作系统时就已了解,现在相当于回顾和加深印象。