如果一个对象有多个 synchronized ,某个时刻某个线程
已经进入到了某个synchronized方法,那么在该方法没有
执行完毕前,其他线程是无法访问该对象的任何synchronized
方法。
原因:
JAVA中的[color=red]每一个对象都有一个锁(lock)[/color]或者叫做监视器(monitor).当访问某个
对象的synchronized 方法时,表示将该对象上锁,此时其他任何线程都无法再
去访问该synchronized方法了,直到之前的那个线程执行方法完毕后(或者是抛出
了异常),那么将该对象的锁释放掉,其他线程才有可能再去访问该synchronized方法。
package thread;
public class ThreadTest4 {
public static void main(String[] args) {
Example example = new Example();
TheThread thread = new TheThread(example);
TheThread2 thread1 = new TheThread2(example);
thread.start();
thread1.start();
}
}
class Example {
public synchronized void execute() {
for(int i = 0; i < 20 ;i++) {
System.out.println("hello: "+i);
}
}
public synchronized void execute2() {
for(int i = 0; i < 20 ;i++) {
System.out.println("word: "+i);
}
}
}
class TheThread extends Thread {
private Example example;
public TheThread(Example example) {
this.example = example;
}
@Override
public void run() {
// TODO Auto-generated method stub
example.execute();
}
}
class TheThread2 extends Thread {
private Example example;
public TheThread2(Example example) {
this.example = example;
}
@Override
public void run() {
// TODO Auto-generated method stub
example.execute2();
}
}
已经进入到了某个synchronized方法,那么在该方法没有
执行完毕前,其他线程是无法访问该对象的任何synchronized
方法。
原因:
JAVA中的[color=red]每一个对象都有一个锁(lock)[/color]或者叫做监视器(monitor).当访问某个
对象的synchronized 方法时,表示将该对象上锁,此时其他任何线程都无法再
去访问该synchronized方法了,直到之前的那个线程执行方法完毕后(或者是抛出
了异常),那么将该对象的锁释放掉,其他线程才有可能再去访问该synchronized方法。
package thread;
public class ThreadTest4 {
public static void main(String[] args) {
Example example = new Example();
TheThread thread = new TheThread(example);
TheThread2 thread1 = new TheThread2(example);
thread.start();
thread1.start();
}
}
class Example {
public synchronized void execute() {
for(int i = 0; i < 20 ;i++) {
System.out.println("hello: "+i);
}
}
public synchronized void execute2() {
for(int i = 0; i < 20 ;i++) {
System.out.println("word: "+i);
}
}
}
class TheThread extends Thread {
private Example example;
public TheThread(Example example) {
this.example = example;
}
@Override
public void run() {
// TODO Auto-generated method stub
example.execute();
}
}
class TheThread2 extends Thread {
private Example example;
public TheThread2(Example example) {
this.example = example;
}
@Override
public void run() {
// TODO Auto-generated method stub
example.execute2();
}
}