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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵庆礼 中级黑马   /  2012-7-4 23:56  /  1611 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由  赵庆礼 于 2012-7-5 11:44 编辑

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadTest {

     /**
      * @param args
      */
     
     private int j;
     private Lock lock = new ReentrantLock();
     public static void main(String[] args) {
          // TODO Auto-generated method stub
          ThreadTest tt = new ThreadTest();
          for(int i=0;i<2;i++)
          {
              new Thread(tt.new Adder()).start();
              new Thread(tt.new Subtractor()).start();
          }
     }

     private class Subtractor implements Runnable
     {

          @Override
          public void run() {
              // TODO Auto-generated method stub
              while(true)
              {
                   /*synchronized (ThreadTest.this) {              
                        System.out.println("j--=" + j--);
                        //这里抛异常了,锁能释放吗?
                   }*/
                   lock.lock();
                   try
                   {
                        System.out.println("j--=" + j--);
                   }finally
                   {
                        lock.unlock();
                   }
              }
          }
         
     }
     
     private class Adder implements Runnable
     {

          @Override
          public void run() {
              // TODO Auto-generated method stub
              while(true)
              {
                   /*synchronized (ThreadTest.this) {
                   System.out.println("j++=" + j++);
                   }*/
                   lock.lock();
                   try
                   {
                        System.out.println("j++=" + j++);
                   }finally
                   {
                        lock.unlock();
                   }                  
              }            
          }
         
     }
}

看了毕老师的视频,Lock锁比synchronized 锁更方便准确,但是对于Lock替换synchronized 还是有点不解,请哪位帮我仔细讲解一下,谢谢

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

2 个回复

倒序浏览
老师在讲synchronized时也一直说锁,但那个隐式的,你看不到,而Lock其实就是把锁显式,你可以看到。另外那个 lock.unlock();要放在finally里就是说一定要执行,也是为了防止如果你放在执行代码下面的话,如果执行过程抛出异常功能结束后,就执行不到lock.unlock();但线程依然持有锁不放,那别的线程就进不来,所以lock.unlock();是必须要执行的,释放资源也就是锁

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  
public void run() {//这个地方应该抛出一个InterruptedException,应该改为public void run() throws InterruptedException
              // TODO Auto-generated method stub
              while(true)
              {
                   /*synchronized (ThreadTest.this) {              
                        System.out.println("j--=" + j--);
                        //这里抛异常了,锁能释放吗?使用synchronized()进行同步时,当synchronized()的代码执行完锁就会自动释放了
                   }*/
                   lock.lock();
                   try//把需要检查异常的代码放在这里面
                   {
                        System.out.println("j--=" + j--);
                   }finally
                   {
                        lock.unlock();//释放锁一定要执行,要不会留下安全隐患,因此放在这里
                   }//上面的代码从 lock.lock();到 lock.unlock();,相当于
                  synchronized (ThreadTest.this) {              
                        System.out.println("j--=" + j--);  
                   }
              }
          }
         
     }
     使用lock来代替synchronized可以自行控制锁释放的时间,lock 必须在 finally 块中释放,否则,如果受保护的代码将抛出异常,锁就有可能永远得不到释放;而使用synchronized同步时,锁就会自动释放。但是synchronized同步时无法中断一个正在等候获得锁的线程。
   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马