Java 浅析同步与锁定的区别

Java 浅析同步与锁定的区别,java,multithreading,Java,Multithreading,我是线程世界的新手,我正在研究线程到最新的util包可重入锁定机制,我正在研究同步机制和新添加的锁定机制之间的基本区别,正如本文中所述,这些是区别 ReentrantLock和synchronized关键字之间的另一个显著区别是公平性。synchronized关键字不支持公平性。任何线程在释放后都可以获得锁,不能指定任何首选项,另一方面,您可以在创建ReentrantLock实例时通过指定Fairity属性使ReentrantLock公平。公平性属性为等待时间最长的线程提供锁,以防争用。请提供一

我是线程世界的新手,我正在研究线程到最新的util包可重入锁定机制,我正在研究同步机制和新添加的锁定机制之间的基本区别,正如本文中所述,这些是区别

  • ReentrantLock和synchronized关键字之间的另一个显著区别是公平性。synchronized关键字不支持公平性。任何线程在释放后都可以获得锁,不能指定任何首选项,另一方面,您可以在创建ReentrantLock实例时通过指定Fairity属性使ReentrantLock公平。公平性属性为等待时间最长的线程提供锁,以防争用。请提供一个小程序来证明这一点,我可以掌握更多

  • synchronized和ReentrantLock之间的主要区别在于,可以中断地、超时地尝试锁定。线程不需要无限阻塞,这是synchronized的情况,请提供一个小程序来证明这一点,我可以掌握更多

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

  • 伙计们,你们能提供一个小程序来展示以上三点吗

    我已经试过这个程序,请告诉我需要做什么改变来证明以上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
    

    一个程序会显示什么,上面的解释和javadoc还没有呢?你为什么不试着做一个这样的计划呢?投票结束,因为这太广泛了。在实践中阅读Java并发性,它涵盖了这个主题,并提供了示例代码。这些概念比在“简单”的程序中更容易理解。我建议您阅读更多关于Java并发性的内容,以便理解核心概念。当你这样做的时候,这些解释就会变得显而易见。最好的学习方法就是自己编写这段代码!着手在实践中获得Java并发性的副本,阅读它并在那里玩示例代码。您试图解决的问题是什么?如果您没有立即的需求,我只想了解其中的差异,并在您有用例时更详细地检查它们。