面试题-简述synchronized和java.util.concurrent.locks.Lock的异同 ?

来源:互联网 发布:java如何输入一个数 编辑:程序博客网 时间:2024/05/29 13:56


主要相同点:Lock能完成synchronized所实现的所有功能

主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。

举例说明(对下面的题用lock进行了改写):

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更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。

举例说明(对下面的题用lock进行了改写):

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();                }                            }                    }    }}
阅读全文
0 0