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()方法内部!");
- }
- }
复制代码 |
|