`

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

    博客分类:
  • Java
 
阅读更多

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

回答:不能,一个对象的一个synchronized方法只能由一个线程访问。 
纠正:对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的。

 

 

public class ThreadTest { 
int i = 0; 
int j = 0; 

public static void main(String[] args) { 
	final ThreadTest threadTest = new ThreadTest(); 
	new Thread() { 
		public void run() { 
		threadTest.printI(); 
		} 
	}.start(); 

	new Thread() { 
		public void run() { 
		threadTest.printJ(); 
		} 
	}.start(); 
} 

	public synchronized void printI() { 
		while (i < 100) 
		System.out.println("i==" + i++); 
	} 

	public void printJ() { 
		while (j < 10) 
		System.out.println("j==" + j++); 
	} 
}

 运行结果:

C:\Program Files\Notepad++>java -cp "D:\shanshan\java" "ThreadTest"
i==0
i==1
j==0
i==2
j==1
i==3
j==2
i==4
j==3
i==5
j==4
i==6
j==5
i==7
j==6
i==8
j==7
i==9
j==8
i==10
j==9
i==11
i==12
i==13
i==14
i==15
i==16
i==17
i==18
i==19
i==20
i==21
i==22
i==23
i==24
i==25
i==26
i==27
i==28
i==29
i==30
i==31
i==32
i==33
i==34
i==35
i==36
i==37
i==38
i==39
i==40
i==41
i==42
i==43
i==44
i==45
i==46
i==47
i==48
i==49
i==50
i==51
i==52
i==53
i==54
i==55
i==56
i==57
i==58
i==59
i==60
i==61
i==62
i==63
i==64
i==65
i==66
i==67
i==68
i==69
i==70
i==71
i==72
i==73
i==74
i==75
i==76
i==77
i==78
i==79
i==80
i==81
i==82
i==83
i==84
i==85
i==86
i==87
i==88
i==89
i==90
i==91
i==92
i==93
i==94
i==95
i==96
i==97
i==98
i==99

C:\Program Files\Notepad++>pause
请按任意键继续. . .

 

0
4
分享到:
评论
15 楼 EnochFallen 2012-08-09  
把你的循环改成了50,下面是结果:
i==0
i==1
i==2
i==3
i==4
i==5
i==6
i==7
i==8
i==9
i==10
i==11
i==12
i==13
i==14
i==15
i==16
i==17
i==18
i==19
i==20
i==21
i==22
i==23
i==24
i==25
i==26
i==27
i==28
i==29
i==30
i==31
i==32
i==33
i==34
i==35
i==36
i==37
i==38
i==39
i==40
i==41
i==42
i==43
i==44
i==45
i==46
i==47
i==48
i==49
j==0
j==1
j==2
j==3
j==4
j==5
j==6
j==7
j==8
j==9
14 楼 heerwa 2011-09-21  
13 楼 kissyssong 2011-09-16  
543089122 写道
这么基础的东西 居然还上首页。。。难道就因为标题够大???

估计是点错了选项了,刚发现被锁定,不能撤销
12 楼 kissyssong 2011-09-16  
langyu 写道
貌似江湖上也没有这样的谣言吧?

看到一个面试题目上写的答案
11 楼 kissyssong 2011-09-16  
287854442 写道
例子完全不足以证明你的论点啊。

恩那
10 楼 kissyssong 2011-09-16  
haoweishow 写道
纠正:对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的。


也没见你有例子证明,不能访问对象的其他synchronized方法啊???

恩,是的。
9 楼 kissyssong 2011-09-16  
看的面试题目上面有这道题,又觉得答案有些问题,所以才。本只想自己收藏者卡看看的。估计是点错了选项,才跑到首页的。
8 楼 kissyssong 2011-09-16  
我错了,
7 楼 287854442 2011-09-16  
例子完全不足以证明你的论点啊。
6 楼 543089122 2011-09-16  
这么基础的东西 居然还上首页。。。难道就因为标题够大???
5 楼 langyu 2011-09-15  
貌似江湖上也没有这样的谣言吧?
4 楼 inosin 2011-09-15  
辟谣这词用大了
3 楼 samttsch 2011-09-15  
。。。这个还辟谣。。。
2 楼 walldr2161 2011-09-15  
太深奥了  米有看懂,,,,,,
1 楼 haoweishow 2011-09-15  
纠正:对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的。


也没见你有例子证明,不能访问对象的其他synchronized方法啊???

相关推荐

    多线程,高并发.pdf

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

    线程编程面试题

    #### 64、当一个线程进入一个对象的一个`synchronized`方法后,其它线程是否可进入此对象的其它方法? - **`synchronized`方法的作用**:如果一个线程已经进入了某个对象的`synchronized`方法,其他线程就不能再进入...

    多线程面试题

    继承Thread类直接覆盖run()方法,而实现Runnable接口则需要创建一个实现了Runnable接口的类,并重写run()方法,然后通过Thread类的构造函数传入Runnable对象来创建线程。 3. **线程状态**:Java中的线程有五种状态...

    java经典多线程面试题

    - 线程互斥(Mutual Exclusion)是指多个线程在同一时刻只有一个能进入临界区(Critical Section),也就是访问共享资源的那段代码。 4. synchronized关键字的用法有哪些? - 在方法上使用,对当前对象实例进行...

    2020面试题总结多线程篇.pdf

    * volatile 可以保证可见性,当一个变量被 volatile 修饰后,表示着线程本地内存无效,当一个线程修改共享变量后他会自己被更新到主内存中,当其他线程读取共享变量时,他会直接从主内存中读取。 * volatile 可以...

    线程面试题

    `Callable`的`call()`方法执行后会返回一个`Future`对象,可以用来获取任务的结果或取消任务。 - `Callable`接口是在JDK 1.5中引入的,相比`Runnable`接口提供了更强大的功能。 7. **CyclicBarrier和...

    个人总结40个Java多线程面试问题和答案

    synchronized关键字可以用来修饰方法或代码块,确保在同一个时刻只有一个线程可以访问该资源。 9. deadlock是什么? deadlock是多线程编程中的一种错误,发生在两个或多个线程之间的资源竞争问题。deadlock可能会...

    java面试题之多线程

    - 当一个线程进入对象的 `synchronized` 方法后,其他线程无法进入该对象的其他 `synchronized` 方法,因为对象的锁已被占用。 6. **线程同步方法**: - `wait()`, `sleep()`, `notify()`, `notifyAll()` 都是...

    线程同步面试题深入解析

    - 排他性:一个线程在执行同步方法或同步块时,其他线程无法同时访问同一对象的其他同步方法或同步块。 - 等待/唤醒机制:`wait()`、`notify()`和`notifyAll()`用于线程间的通信,控制线程的执行顺序。 - 锁的...

    多线程,高并发面试题.pdf

    针对同步问题,当一个线程进入一个对象的同步方法后,其他线程是无法进入这个对象的其他同步方法的,除非前一个线程在执行完毕后释放锁。然而,如果使用的是非同步方法,或者同步方法内部调用了wait(),其他线程是有...

    多线程面试59题(含答案).pdf

    RUNNABLE 状态表示线程已经启动,BLOCKED 状态表示线程阻塞,WAITING 状态表示线程处于无限制等待状态,TIMED_WAITING 状态表示线程进入了一个有时限的等待,TERMINATED 状态表示线程执行完毕后,进行终止状态。...

    史上最强多线程面试44题和答案:线程锁+线程池+线程同步等

    - **可见性**:当多个线程访问同一个共享变量时,其中一个线程对这个变量进行了修改,其他线程能够立即看到修改后的结果。为了实现可见性,通常采用`synchronized`关键字或者显式锁`Lock`来确保修改后的值能被所有...

    高并发多线程面试专题及答案(上).pdf

    每次进入一个Synchronized方法时,对象的锁计数器会递增,当线程退出同步方法时,计数器递减,直到计数器为0时,锁被释放。 4. JVM对原生锁的优化 Java早期版本中,Synchronized的实现完全依赖于操作系统提供的互斥...

    java面试精品全集[线程部分]

    当线程调用`wait()`方法后,它将释放对象锁并进入等待状态,直到另一个线程调用该对象的`notify()`或`notifyAll()`方法。 #### 3. 同步块与同步方法的区别? - **同步块**:通过`synchronized`关键字指定一个特定...

    多线程面试题.docx

    - 一个线程访问某对象的 synchronized 方法,其他线程对同一对象的其他 synchronized 方法或代码块将被阻塞。 5. **线程控制方法** - **sleep()**:使线程进入休眠状态,释放 CPU 时间片,但不释放锁,指定时间后...

    27道顶尖的Java多线程、锁、内存模型面试题!.pdf

    例如,一个线程在持有对象锁的情况下,调用了该对象的另一个synchronized方法,如果锁不支持重入,线程将无法继续执行,可能导致死锁。对于Synchronized来说,由于在获取锁时会检查是否已经持有该锁,因此它是可重入...

    多线程经典面试题和答案

    每个对象都有一个锁,线程可以通过调用对象的 `wait()` 方法来等待特定的对象锁。如果这些方法被定义在 `Thread` 类中,则可能引起混淆,不清楚线程是在等待哪个对象的锁。 - **在同步上下文中调用**:为了避免竞态...

    程序员面试中的多线程问题

    当一个线程试图在没有获取到对象锁的情况下调用`wait()`、`notify()`或`notifyAll()`方法时,会抛出`InvalidMonitorStateException`异常。这是因为这些方法都是在同步上下文中操作的,它们要求调用线程必须是对象的...

    Java程序员面试中的多线程问题

    当一个线程试图在没有获取到对象锁的情况下调用`wait()`、`notify()`或`notifyAll()`方法时,会抛出`InvalidMonitorStateException`异常。这是因为这些方法只能在同步块或方法内部调用,并且当前线程必须已经获得了...

Global site tag (gtag.js) - Google Analytics