黑马程序员技术交流社区
标题:
同步锁总结
[打印本页]
作者:
a80C51
时间:
2015-9-28 23:52
标题:
同步锁总结
1)同步锁由Lock对象充当;
2)Lock是控制多线程对共享资源进行访问的工具。
3)在实现线程安全的控制中,比较常用的是ReentrantLock(可重入锁)。
4)ReentrantLock锁具有可重入性,换言之,一个线程可以对被加锁的ReentrantLock锁再次加锁,用计数器来追踪lock()的嵌套使用,调用lock()方法后必须显示调用unlock()方法来释放锁。
5)一段被锁保护的代码可以调用另外一段被相同锁保护的方法。
6)Lock和同步代码块、同步方法的优劣:
A,同步代码块和同步方法中,同步方法隐式使用当前对象作为同步监视器;而Lock则是显示的使用Lock对象作为同步锁。
B,同步代码块或者同步方法强制要求加锁和释放锁,在同一个块结构中;而Lock则使用finally块来确保释放锁。
C,Lock提供了同步方法和同步代码块锁没有的其他功能。
7)死锁:
定义,当两个线程相互等待对方释放同步监视器时,就会发生死锁。
8)代码举例
//MyDeadLockApp.java
package com.wayne.practice;
public class MyDeadLockApp implements Runnable {
AClass aClass = new AClass();
BClass bClass = new BClass();
public void init()
{
Thread.currentThread().setName("主线程!");
aClass.bar(bClass);
System.out.println("进入了主线程后");
}
@Override
public void run() {
Thread.currentThread().setName("副线程!");
bClass.foo(aClass);
System.out.println("进入了副线程后");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MyDeadLockApp myDeadLockApp = new MyDeadLockApp();
new Thread(myDeadLockApp).start();
myDeadLockApp.init();
}
}
复制代码
//AClass.java
package com.wayne.practice;
public class AClass {
public synchronized void bar(BClass bClass) {
System.out.println("当前线程为:"+Thread.currentThread().getName()
+"进入AClass的bar方法");
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("当前线程为:"+Thread.currentThread().getName()
+"尝试调用BClass的last方法");
bClass.last();
}
public synchronized void last() {
// TODO Auto-generated method stub
System.out.println("进入AClass的last()方法内部!");
}
}
复制代码
//BClass.java
package com.wayne.practice;
public class BClass {
public synchronized void foo(AClass aClass) {
System.out.println("当前线程为:"+Thread.currentThread().getName()+
"进入BClass的foo()方法");
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("尝试调用AClass的last()方法");
aClass.last();
}
public synchronized void last() {
System.out.println("进入BClass的last()方法内部!");
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2