分析同步和锁定之间的区别

时间:2013-03-07 17:03:41

标签: java multithreading

我是Threads世界的新手,我正在通过最新的util包重入锁机制的线程,我正在经历同步机制和新添加的锁机制之间的基础差异,如文章中的这些是差异..

  1. ReentrantLock和synchronized关键字之间的另一个显着区别是公平性。 synchronized关键字不支持公平性。任何线程一旦释放就可以获得锁定,不能指定首选项,另一方面,您可以通过指定公平属性使ReentrantLock公平,同时创建ReentrantLock实例。在争用的情况下,公平属性提供对最长等待线程的锁定。如果你能提供一个证明这一点的小程序,我可以掌握更多

  2. synchronized和ReentrantLock之间的主要区别是能够以可中断的方式尝试锁定,并且具有超时功能。线程不需要无限阻塞,这是同步的情况,如果你能提供一个小程序来证明这一点,我可以掌握更多

  3. Java中ReentrantLock和synchronized关键字之间的另一个值得注意的区别是,在等待Lock时中断Thread的能力。在synchronized关键字的情况下,可以无限期地阻塞线程等待锁定,并且无法控制该线程。 ReentrantLock提供了一个名为lockInterruptibly()的方法,可用于在等待锁定时中断线程。类似地,如果在某段时间内锁定不可用,则tryLock()超时可用于超时。如果你能提供一个证明这一点的小程序,我可以掌握更多

  4. 伙计们,请你提供一个小程序,显示以上三点

    我已经尝试过这个程序,请告知需要做哪些更改来证明以上3点..

    public class ReentrantLockHowto {
    
        private final ReentrantLock lock = new ReentrantLock();
        private int count = 0;
    
         //Locking using Lock and ReentrantLock
         public int getCount() {
            lock.lock();
            try {
                System.out.println(Thread.currentThread().getName() + " gets Count: " + count);
                return count++;
            } finally {
                lock.unlock();
            }
         }
    
         //Implicit locking using synchronized keyword
         public int getCountTwo() {
                return count++;
         }
    
    
    
        public static void main(String args[]) {
            final ThreadTest counter = new ThreadTest();
            Thread t1 = new Thread() {
    
                @Override
                public void run() {
                    while (counter.getCount() < 6) {
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();                    }
                    }
                }
            };
    
            Thread t2 = new Thread() {
    
                @Override
                public void run() {
                    while (counter.getCount() < 6) {
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();
                        }
                    }
                }
            };
    
            t1.start();
            t2.start();
    
        }
    }
    

    输出:

    Thread-0 gets Count: 0
    Thread-1 gets Count: 1
    Thread-1 gets Count: 2
    Thread-0 gets Count: 3
    Thread-1 gets Count: 4
    Thread-0 gets Count: 5
    Thread-0 gets Count: 6
    Thread-1 gets Count: 7
    

0 个答案:

没有答案