`
huiqinbo
  • 浏览: 344502 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

阅读更多

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

 

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?(2nd)

 

日前在网上见到一道Java笔试试题,如题所述。给出的答案如下:

答:不能,一个对象的一个synchronized方法只能由一个线程访问。

 

本人认为有些所答非所问。故写了两个demo进行测试。发现答案要分三种情况讨论。

 

情况一:

当一个线程进入一个对象的一个synchronized方法后,其它线程访问该对象的非同步方法。

代码如下:

package com.mutithreading.Object;

 

public class InvokedObject

{

   

    public synchronized void synchronizedMethod()

    {

       System.out.println("Invoked synchronizedMethod !") ;

       try {

           Thread.sleep(10000) ;

       } catch (InterruptedException e) {

           e.printStackTrace();

       }

    }

   

    public void generalMethod()

    {

       System.out.println("Invoked generalMethod ...") ;

    }

 

}

 

 

package com.mutithreading.threads;

import com.mutithreading.Object.InvokedObject;

 

public class ThreadOne implements Runnable {

 

    private InvokedObject object ;

   

    public ThreadOne(InvokedObject object)

    {

       this.object = object ;

    }

   

    public void run() {

      

       object.synchronizedMethod() ;

 

    }

 

}

 

 

package com.mutithreading.threads;

import com.mutithreading.Object.InvokedObject;

 

public class ThreadTwo implements Runnable {

 

    private InvokedObject object ;

   

    public ThreadTwo(InvokedObject object)

    {

       this.object = object ;

    }

 

    public void run() {

       // TODO Auto-generated method stub

       object.generalMethod() ;

    }

 

}

 

package com.mutithreading.client;

import com.mutithreading.Object.InvokedObject;

import com.mutithreading.threads.ThreadOne;

import com.mutithreading.threads.ThreadTwo;

 

public class Client {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

 

       InvokedObject object = new InvokedObject() ;

      

       ThreadOne one = new ThreadOne(object) ;

       ThreadTwo two = new ThreadTwo(object) ;

      

       Thread threadOne = new Thread(one) ;

       Thread threadTwo = new Thread(two) ;

      

       threadOne.start() ;

       threadTwo.start() ;

 

    }

 

}

 

运行结果:

一个线程在访问一个对象的同步方法时,另一个线程可以同时访问这个对象的非同步方法。
 


 

 

 

情况二:

当一个线程进入一个对象的一个synchronized方法后,其它线程也访问该同步方法。

 

运行结果:

一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个同步方法。(代码略)
 


 

 

 

情况三:

当一个线程进入一个对象的一个synchronized方法后,其它线程同时访问该对象的另一个同步方法。

 

此处仅给出对InvokedObject类做出的修改代码:

package com.mutithreading.Object;

 

public class InvokedObject

{

   

    public synchronized void synchronizedMethod1()

    {

       System.out.println("Invoked synchronizedMethod1 !") ;

       try {

           Thread.sleep(10000) ;

       } catch (InterruptedException e) {

           e.printStackTrace();

       }

    }

   

    public synchronized void synchronizedMethod2()

    {

       System.out.println("Invoked synchronizedMethod2 !") ;

    }

 

}

 

 

运行结果:

一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个对象的另一个同步方法。

分享到:
评论

相关推荐

    多线程,高并发.pdf

    4. 当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法? 5. 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同? 6. 概括的解释下线程的几种可用状态。

    java的线程同步机制synchronized关键字的理解_.docx

    synchronized 方法的缺陷是:同一个对象的不同线程之间会形成互斥,而对这个对象所属的 Class 所产生的另一对象却可以任意调用这个被加了 synchronized 关键字的方法。 synchronized 块 除了方法前用 synchronized...

    synchronized枷锁实例

    对象锁是针对类的实例对象而言的,当一个线程访问某个对象的非静态 synchronized 方法或同步代码块时,会获取到该对象的锁。这种锁确保了同一时间只有一个线程能访问该对象的成员变量。例如: ```java public class...

    java 多线程synchronized互斥锁demo

    标题中的"java 多线程synchronized互斥锁demo"指的是一个示例,展示了如何在多线程环境下使用`synchronized`关键字创建互斥锁,确保同一时间只有一个线程可以访问特定的代码块或方法。 描述中的"一个多线程访问的同...

    线程的几个重要方法.doc

    `notify()`唤醒一个等待该对象的线程,使其进入可运行状态;`notifyAll()`唤醒所有等待该对象的线程。这些方法必须在同步块或同步方法中使用,以防止竞态条件和死锁的发生。 在实际编程中,理解并熟练掌握这些线程...

    Java使用synchronized修饰方法来同步线程的实例演示

    当一个线程进入synchronized代码块或方法时,它会获取与该代码块或方法关联的对象锁。其他尝试进入相同代码块或方法的线程将被阻塞,直到当前线程执行完毕并释放锁。这样可以确保在任何给定时刻,只有一个线程能够...

    使用synchronized实现多线程同步.pdf

    1. 对于类的实例方法,如果一个线程正在执行某对象的`synchronized`实例方法,其他线程不能通过同一个对象调用该方法,但可以通过其他对象实例调用。 2. 类的静态方法被`synchronized`修饰时,它会锁定类的Class对象...

    Java synchronized关键_动力节点Java学院整理

    1. **互斥性**:当一个线程正在执行某个对象的`synchronized`方法或代码块时,其他线程无法同时访问该对象的其他`synchronized`方法或代码块。这意味着在同一时间,只能有一个线程持有对象的锁。 2. **可重入性**:...

    java_synchronized详解

    当一个线程进入某个对象的一个`synchronized`代码块时,它会自动获得该对象的锁;离开该代码块时,则自动释放锁。如果其他线程尝试访问同一对象的其他`synchronized`代码块,它们将被阻塞,直到第一个线程释放锁为止...

    java synchronized详解

    这里的`对象`是监视器对象,当多个线程试图进入同一监视器对象的同步代码块时,只有一个线程能进入,其他线程必须等待。 4. **监视器对象与锁的概念** 每个Java对象都可以作为锁,当线程访问`synchronized`方法或...

    java synchronized 学习

    * 若此对象对应的类中包含了多个 synchronized 修饰的方法或代码块,多个线程访问同一个对象的任意 synchronized 修饰的方法或代码块,只要有一个线程拥有了 synchronized 同步锁,其他线程不管想访问 synchronized ...

    java 多线程同步方法的实例

    当一个线程进入synchronized方法或代码块时,其他试图访问同一对象的线程会被阻塞,直到该线程执行完毕并释放锁。例如,`public synchronized void method()`就是一个同步方法。 2. **wait()、notify()和notifyAll...

    java锁机制Synchronizedjava锁机制Synchronized

    当一个线程想要进入一个上锁房间时,它需要先拿到钥匙,然后才能进入房间。拿到钥匙后,其他线程不能进入该房间,直到钥匙被归还。如果一个线程想要连续使用两个上锁房间,它需要每次使用完一个房间后把钥匙归还,...

    两个线程交替执行

    在上述代码中,我们可以看到两个线程 a 和 b,它们之间通过一个锁对象 LOCK 进行同步。线程 a 负责打印数字 1、2、3,而线程 b 负责打印数字 4、5、6。通过使用 synchronized 关键字,我们可以确保在某个时刻只有一...

    java多线程中synchronized关键字的用法

    java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com

    java-synchronized详解.doc

    1. 互斥性:当一个线程进入一个由`synchronized`修饰的方法或代码块后,其他试图进入相同同步代码的线程将会被阻塞,直到当前线程执行完毕并释放锁。 2. 锁的概念:每个对象都有一个与之关联的锁,当线程执行`...

    synchronized 实现多线程 implements Runnable

    一个简单的多线程代码示例,Java实现,用于实现同一时刻,只允许一个线程调用执行的代码块或类,即synchronized的如何使用(多线程实现),实现 Runnable

    16.线程的同步机制-synchronized同步方法-多个对象使用多个对象锁.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

Global site tag (gtag.js) - Google Analytics