知识点:http://note.youdao.com/noteshare?id=5d44cd6e03ba201670ea36c2e106e719&sub=F3BA3E6EB60B4D64BA0A846F4C7DCCA6
案例0:在多个线程中,调用被synchronized 修饰的方法的对象是同一个对象》则this代表的对象可以是个静态成员变量
public class DemowenApplication extends Thread {
public static void main(String[] args) {
Mm mm = new Mm();
for (int i = 0; i < 3; ++i) {
Thread thread = new Thread() {
@Override
public void run() {
mm.mm();
}
};
thread.start();
}
}
}
class Mm {
public void mm() {
synchronized (this) {
System.out.println("进入方法");
System.out.println("test开始..");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("test结束..");
}
}
}
main方法的运行结果:
进入方法
test开始..
睡眠5秒(我加的,不是输出内容)
test结束..
进入方法
test开始..
睡眠5秒(我加的,不是输出内容)
test结束..
进入方法
test开始..
睡眠5秒(我加的,不是输出内容)
test结束..
正面案例1: 在多个线程中,调用被synchronized 修饰的方法的对象不是同一个对象》则this代表的对象必须是个静态成员变量
public class DemowenApplication extends Thread {
static Mm bb = new Mm();
public void run() {
bb.mm();
}
public static void main(String[] args) {
for (int i = 0; i < 3; ++i) {
Thread thread = new DemowenApplication();
thread.start();
}
}
}
class Mm {
public void mm() {
synchronized(this){
System.out.println("进入方法");
System.out.println("test开始..");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("test结束..");
}
}
}
main方法的运行结果:
进入方法
test开始..
睡眠5秒(我加的,不是输出内容)
test结束..
进入方法
test开始..
睡眠5秒(我加的,不是输出内容)
test结束..
进入方法
test开始..
睡眠5秒(我加的,不是输出内容)
test结束..
反面案例1:在多个线程中,调用被synchronized 修饰的方法的对象不是同一个对象 且 this代表的对象不是静态成员变量
public class DemowenApplication extends Thread {
static Mm bb = new Mm();
public void run() {
bb.mm();
}
public static void main(String[] args) {
for (int i = 0; i < 3; ++i) {
Thread thread = new DemowenApplication();
thread.start();
}
}
}
class Mm {
public void mm() {
synchronized(this){
System.out.println("进入方法");
System.out.println("test开始..");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("test结束..");
}
}
}
main方法的运行结果:
进入方法
进入方法
test开始..
进入方法
test开始..
test开始..
test结束..
test结束..
test结束..
或结果:
进入方法
test开始..
进入方法
test开始..
进入方法
test开始..
test结束..
test结束..
test结束..