public class SyncTest {
/**
* @param args
*/
public static void main(String[] args) {
/*
* 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
* 答:其他线程可以进入此对象的非同步方法,而不能进入其它的同步方法,
* 因为一个对象中的所有同步方法共用一个物件旗标(也就是对象本身)。
*
* 扩展:若新建另外一个对象,则可以实现两个同步方法同时执行。
*
*/
SyncTest st=new SyncTest();
Thread t=new Thread(st.new Sleep());
t.start(); //Thread-0
t=new Thread(st.new syncPrint());
t.start(); //Thread-1
t=new Thread(st.new Print());
t.start(); //Thread-2
SyncTest st2=new SyncTest();
t=new Thread(st2.new syncPrint());
t.start(); //Thread-3
}
private synchronized void sleep() throws InterruptedException{
Thread.currentThread().setName(Thread.currentThread().getName()+"@@sleep");
System.out.println(Thread.currentThread().getName()+": in ");
Thread.sleep(10000);
System.out.println(Thread.currentThread().getName()+": out ");
}
private synchronized void syncPrint() throws InterruptedException{
Thread.currentThread().setName(Thread.currentThread().getName()+"@@syncPrint");
System.out.println(Thread.currentThread().getName()+": in ");
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+": i="+i);
Thread.sleep(1000);
}
System.out.println(Thread.currentThread().getName()+": out ");
}
private void print() throws InterruptedException{
Thread.currentThread().setName(Thread.currentThread().getName()+"@@print");
System.out.println(Thread.currentThread().getName()+": in ");
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+": i="+i);
Thread.sleep(1000);
}
System.out.println(Thread.currentThread().getName()+": out ");
}
class Sleep implements Runnable{
public void run() {
// TODO Auto-generated method stub
try {
sleep();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Print implements Runnable{
public void run() {
// TODO Auto-generated method stub
try {
print();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class syncPrint implements Runnable{
public void run() {
// TODO Auto-generated method stub
try {
syncPrint();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
运行结果:
Thread-0@@sleep: in
Thread-3@@syncPrint: in
Thread-3@@syncPrint: i=0
Thread-2@@print: in
Thread-2@@print: i=0
Thread-3@@syncPrint: i=1
Thread-2@@print: i=1
Thread-2@@print: i=2
Thread-3@@syncPrint: i=2
Thread-3@@syncPrint: i=3
Thread-2@@print: i=3
Thread-3@@syncPrint: i=4
Thread-2@@print: i=4
Thread-3@@syncPrint: out
Thread-2@@print: out
Thread-0@@sleep: out
Thread-1@@syncPrint: in
Thread-1@@syncPrint: i=0
Thread-1@@syncPrint: i=1
Thread-1@@syncPrint: i=2
Thread-1@@syncPrint: i=3
Thread-1@@syncPrint: i=4
Thread-1@@syncPrint: out
分享到:
相关推荐
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的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。