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
/**
* @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
本文通过实例演示了Java中同步方法的使用方式,解释了一个线程进入对象的同步方法后,其他线程如何交互。展示了不同线程如何访问同步与非同步方法,并验证了创建新对象后同步方法的执行情况。

被折叠的 条评论
为什么被折叠?



