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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张海涛 中级黑马   /  2013-1-17 08:08  /  1167 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张海涛 于 2013-1-17 20:36 编辑

在线程同步中,在一个线程的finally语句块中用lock.unlock()手工释放锁,该锁就一定能释放吗??还是说仍然可能没有释放,继续占有呢?如果真是一定释放的话,下面这段程序运行结果却不能证明这个说法。
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();
                }               
            }            
        }
        
    }
}

评分

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

查看全部评分

3 个回复

倒序浏览
finally里面的代码是一定会执行的
回复 使用道具 举报
finally里面的代码作用是释放资源的,锁就是一个他们的关键资源,是必须会执行的,只有一种不会执行那就是在此语句之前有System.exit(0);所以此锁一定会释放的。

评分

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

查看全部评分

回复 使用道具 举报
finally里面的代码很重要,它是用来释放资源的,无论是否出现异常,它都要必须运行
毕竟资源是很重要的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马