【问题标题】:Can we Access Synchronized method and an unsynchronized method of same instance from multiple threads at the same time?我们可以同时从多个线程访问同一个实例的同步方法和非同步方法吗?
【发布时间】:2018-07-29 16:46:21
【问题描述】:

这似乎是一个非常幼稚的问题,但我在任何地方都找不到任何具体的答案。我什至实际尝试过,但由于我们无法预测 Java 中线程资源分配的行为,因此很难确定。 我只想知道我是否可以从该类的同一实例的两个不同线程同时访问该类的同步方法和非同步方法?

【问题讨论】:

    标签: java multithreading synchronization java-threads


    【解决方案1】:

    没有发现任何问题。试试这个:

    public class Main {
    
        public static final SyncNotsynced sn = new SyncNotsynced();
    
        public static void main(String[] args){
            Thread t1 = new Thread(sn::synced);
            Thread t2 = new Thread(sn::notsynced);
            t1.start();
            t2.start();
        }
    
        public static class SyncNotsynced {
    
            public synchronized void synced(){
                System.out.println(Thread.currentThread().getName() + " enter synced");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                System.out.println(Thread.currentThread().getName() +  " exit synced");
            }
    
            public void notsynced(){
                System.out.println(Thread.currentThread().getName() + " enter notsynced");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                System.out.println(Thread.currentThread().getName() +  " exit notsynced");
            }
        }
    }
    

    或查看live example :)。如您所见,Thread 1Thread 2 的输入都是在退出之前发生的:

    Thread-0 enter synced
    Thread-1 enter notsynced
    Thread-0 exit synced
    Thread-1 exit notsynced
    

    对于正式的解释,你可以阅读JLS 17,但简而言之,只有一个线程可以进入同一个对象监视器上的同步块。

    顺便说一句,我使用了Thread.sleep because(强调我的):

    Thread.sleep 导致当前正在执行的线程休眠 (暂时停止执行)在指定的期限内,受制于 系统计时器和调度程序的精度和准确性。 话题 不会失去对任何监视器的所有权,并恢复执行 将取决于调度和处理器的可用性 执行线程。

    【讨论】:

    • 次要:OP 确实询问了实例方法。我知道静态没有什么不同,你也有......但是为了OP的理解,你可以让你的例子证明它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2012-12-16
    • 1970-01-01
    相关资源
    最近更新 更多