当一个线程进入一个对象的一个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 !") ;
}
}
运行结果:
一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个对象的另一个同步方法。
相关推荐
4. 当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法? 5. 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同? 6. 概括的解释下线程的几种可用状态。
synchronized 方法的缺陷是:同一个对象的不同线程之间会形成互斥,而对这个对象所属的 Class 所产生的另一对象却可以任意调用这个被加了 synchronized 关键字的方法。 synchronized 块 除了方法前用 synchronized...
对象锁是针对类的实例对象而言的,当一个线程访问某个对象的非静态 synchronized 方法或同步代码块时,会获取到该对象的锁。这种锁确保了同一时间只有一个线程能访问该对象的成员变量。例如: ```java public class...
标题中的"java 多线程synchronized互斥锁demo"指的是一个示例,展示了如何在多线程环境下使用`synchronized`关键字创建互斥锁,确保同一时间只有一个线程可以访问特定的代码块或方法。 描述中的"一个多线程访问的同...
`notify()`唤醒一个等待该对象的线程,使其进入可运行状态;`notifyAll()`唤醒所有等待该对象的线程。这些方法必须在同步块或同步方法中使用,以防止竞态条件和死锁的发生。 在实际编程中,理解并熟练掌握这些线程...
当一个线程进入synchronized代码块或方法时,它会获取与该代码块或方法关联的对象锁。其他尝试进入相同代码块或方法的线程将被阻塞,直到当前线程执行完毕并释放锁。这样可以确保在任何给定时刻,只有一个线程能够...
1. 对于类的实例方法,如果一个线程正在执行某对象的`synchronized`实例方法,其他线程不能通过同一个对象调用该方法,但可以通过其他对象实例调用。 2. 类的静态方法被`synchronized`修饰时,它会锁定类的Class对象...
1. **互斥性**:当一个线程正在执行某个对象的`synchronized`方法或代码块时,其他线程无法同时访问该对象的其他`synchronized`方法或代码块。这意味着在同一时间,只能有一个线程持有对象的锁。 2. **可重入性**:...
当一个线程进入某个对象的一个`synchronized`代码块时,它会自动获得该对象的锁;离开该代码块时,则自动释放锁。如果其他线程尝试访问同一对象的其他`synchronized`代码块,它们将被阻塞,直到第一个线程释放锁为止...
这里的`对象`是监视器对象,当多个线程试图进入同一监视器对象的同步代码块时,只有一个线程能进入,其他线程必须等待。 4. **监视器对象与锁的概念** 每个Java对象都可以作为锁,当线程访问`synchronized`方法或...
* 若此对象对应的类中包含了多个 synchronized 修饰的方法或代码块,多个线程访问同一个对象的任意 synchronized 修饰的方法或代码块,只要有一个线程拥有了 synchronized 同步锁,其他线程不管想访问 synchronized ...
当一个线程进入synchronized方法或代码块时,其他试图访问同一对象的线程会被阻塞,直到该线程执行完毕并释放锁。例如,`public synchronized void method()`就是一个同步方法。 2. **wait()、notify()和notifyAll...
当一个线程想要进入一个上锁房间时,它需要先拿到钥匙,然后才能进入房间。拿到钥匙后,其他线程不能进入该房间,直到钥匙被归还。如果一个线程想要连续使用两个上锁房间,它需要每次使用完一个房间后把钥匙归还,...
在上述代码中,我们可以看到两个线程 a 和 b,它们之间通过一个锁对象 LOCK 进行同步。线程 a 负责打印数字 1、2、3,而线程 b 负责打印数字 4、5、6。通过使用 synchronized 关键字,我们可以确保在某个时刻只有一...
java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com
1. 互斥性:当一个线程进入一个由`synchronized`修饰的方法或代码块后,其他试图进入相同同步代码的线程将会被阻塞,直到当前线程执行完毕并释放锁。 2. 锁的概念:每个对象都有一个与之关联的锁,当线程执行`...
一个简单的多线程代码示例,Java实现,用于实现同一时刻,只允许一个线程调用执行的代码块或类,即synchronized的如何使用(多线程实现),实现 Runnable
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。