问题:当一个线程进入一个对象的一个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
请按任意键继续. . .
分享到:
相关推荐
4. 当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法? 5. 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同? 6. 概括的解释下线程的几种可用状态。
#### 64、当一个线程进入一个对象的一个`synchronized`方法后,其它线程是否可进入此对象的其它方法? - **`synchronized`方法的作用**:如果一个线程已经进入了某个对象的`synchronized`方法,其他线程就不能再进入...
继承Thread类直接覆盖run()方法,而实现Runnable接口则需要创建一个实现了Runnable接口的类,并重写run()方法,然后通过Thread类的构造函数传入Runnable对象来创建线程。 3. **线程状态**:Java中的线程有五种状态...
- 线程互斥(Mutual Exclusion)是指多个线程在同一时刻只有一个能进入临界区(Critical Section),也就是访问共享资源的那段代码。 4. synchronized关键字的用法有哪些? - 在方法上使用,对当前对象实例进行...
* volatile 可以保证可见性,当一个变量被 volatile 修饰后,表示着线程本地内存无效,当一个线程修改共享变量后他会自己被更新到主内存中,当其他线程读取共享变量时,他会直接从主内存中读取。 * volatile 可以...
`Callable`的`call()`方法执行后会返回一个`Future`对象,可以用来获取任务的结果或取消任务。 - `Callable`接口是在JDK 1.5中引入的,相比`Runnable`接口提供了更强大的功能。 7. **CyclicBarrier和...
synchronized关键字可以用来修饰方法或代码块,确保在同一个时刻只有一个线程可以访问该资源。 9. deadlock是什么? deadlock是多线程编程中的一种错误,发生在两个或多个线程之间的资源竞争问题。deadlock可能会...
- 当一个线程进入对象的 `synchronized` 方法后,其他线程无法进入该对象的其他 `synchronized` 方法,因为对象的锁已被占用。 6. **线程同步方法**: - `wait()`, `sleep()`, `notify()`, `notifyAll()` 都是...
- 排他性:一个线程在执行同步方法或同步块时,其他线程无法同时访问同一对象的其他同步方法或同步块。 - 等待/唤醒机制:`wait()`、`notify()`和`notifyAll()`用于线程间的通信,控制线程的执行顺序。 - 锁的...
针对同步问题,当一个线程进入一个对象的同步方法后,其他线程是无法进入这个对象的其他同步方法的,除非前一个线程在执行完毕后释放锁。然而,如果使用的是非同步方法,或者同步方法内部调用了wait(),其他线程是有...
RUNNABLE 状态表示线程已经启动,BLOCKED 状态表示线程阻塞,WAITING 状态表示线程处于无限制等待状态,TIMED_WAITING 状态表示线程进入了一个有时限的等待,TERMINATED 状态表示线程执行完毕后,进行终止状态。...
- **可见性**:当多个线程访问同一个共享变量时,其中一个线程对这个变量进行了修改,其他线程能够立即看到修改后的结果。为了实现可见性,通常采用`synchronized`关键字或者显式锁`Lock`来确保修改后的值能被所有...
每次进入一个Synchronized方法时,对象的锁计数器会递增,当线程退出同步方法时,计数器递减,直到计数器为0时,锁被释放。 4. JVM对原生锁的优化 Java早期版本中,Synchronized的实现完全依赖于操作系统提供的互斥...
当线程调用`wait()`方法后,它将释放对象锁并进入等待状态,直到另一个线程调用该对象的`notify()`或`notifyAll()`方法。 #### 3. 同步块与同步方法的区别? - **同步块**:通过`synchronized`关键字指定一个特定...
- 一个线程访问某对象的 synchronized 方法,其他线程对同一对象的其他 synchronized 方法或代码块将被阻塞。 5. **线程控制方法** - **sleep()**:使线程进入休眠状态,释放 CPU 时间片,但不释放锁,指定时间后...
例如,一个线程在持有对象锁的情况下,调用了该对象的另一个synchronized方法,如果锁不支持重入,线程将无法继续执行,可能导致死锁。对于Synchronized来说,由于在获取锁时会检查是否已经持有该锁,因此它是可重入...
每个对象都有一个锁,线程可以通过调用对象的 `wait()` 方法来等待特定的对象锁。如果这些方法被定义在 `Thread` 类中,则可能引起混淆,不清楚线程是在等待哪个对象的锁。 - **在同步上下文中调用**:为了避免竞态...
当一个线程试图在没有获取到对象锁的情况下调用`wait()`、`notify()`或`notifyAll()`方法时,会抛出`InvalidMonitorStateException`异常。这是因为这些方法都是在同步上下文中操作的,它们要求调用线程必须是对象的...
当一个线程试图在没有获取到对象锁的情况下调用`wait()`、`notify()`或`notifyAll()`方法时,会抛出`InvalidMonitorStateException`异常。这是因为这些方法只能在同步块或方法内部调用,并且当前线程必须已经获得了...