A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© a80C51 中级黑马   /  2015-9-28 23:52  /  184 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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
  1. package com.wayne.practice;

  2. public class MyDeadLockApp implements Runnable {
  3.        
  4.         AClass aClass = new AClass();
  5.         BClass bClass = new BClass();
  6.        
  7.         public void init()
  8.         {
  9.                 Thread.currentThread().setName("主线程!");
  10.                 aClass.bar(bClass);
  11.                 System.out.println("进入了主线程后");
  12.         }

  13.         @Override
  14.         public void run() {
  15.                 Thread.currentThread().setName("副线程!");
  16.                 bClass.foo(aClass);
  17.                 System.out.println("进入了副线程后");

  18.         }

  19.         public static void main(String[] args) {
  20.                 // TODO Auto-generated method stub
  21.                 MyDeadLockApp myDeadLockApp = new MyDeadLockApp();
  22.                
  23.                 new Thread(myDeadLockApp).start();
  24.                
  25.                 myDeadLockApp.init();
  26.                

  27.         }

  28. }
复制代码


//AClass.java
  1. package com.wayne.practice;

  2. public class AClass {

  3.         public synchronized void bar(BClass bClass) {
  4.                 System.out.println("当前线程为:"+Thread.currentThread().getName()
  5.                                 +"进入AClass的bar方法");
  6.                
  7.                 try {
  8.                         Thread.sleep(200);
  9.                 } catch (InterruptedException e) {
  10.                         // TODO Auto-generated catch block
  11.                         e.printStackTrace();
  12.                 }
  13.                
  14.                 System.out.println("当前线程为:"+Thread.currentThread().getName()
  15.                                 +"尝试调用BClass的last方法");
  16.                
  17.                 bClass.last();
  18.         }

  19.         public synchronized void last() {
  20.                 // TODO Auto-generated method stub
  21.                 System.out.println("进入AClass的last()方法内部!");
  22.                
  23.         }
  24.        
  25.        

  26. }
复制代码


//BClass.java
  1. package com.wayne.practice;

  2. public class BClass {

  3.         public synchronized void foo(AClass aClass) {
  4.                 System.out.println("当前线程为:"+Thread.currentThread().getName()+
  5.                                 "进入BClass的foo()方法");
  6.                 try {
  7.                         Thread.sleep(200);
  8.                 } catch (InterruptedException e) {
  9.                         // TODO Auto-generated catch block
  10.                         e.printStackTrace();
  11.                 }
  12.                
  13.                 System.out.println("尝试调用AClass的last()方法");
  14.                 aClass.last();
  15.                
  16.         }

  17.         public synchronized void last() {
  18.                 System.out.println("进入BClass的last()方法内部!");               
  19.         }

  20. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马