总览
- 多线程+对象在方法内部
- 多线程+对象在方法外部
- 多线程+单对象+synchronized
- 多线程+多对象+synchronized
- 多线程+synchronized+static
- 多线程+单对象+synchronized+static
- 多线程+多对象+synchronized+static
多线程+多对象+synchronized(例子)
1)HasSelPrivateNum.java类
public class HasSelPrivateNum {
private int num = 0;
synchronized public void addI(String username) {
try {
if (username.equals("a")) {
num = 100;
System.out.println("a set over");
Thread.sleep(2000);
} else {
num = 200;
System.out.println("b set over");
}
System.out.println(username + " num=" + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
(2)ThreadA.java
public class ThreadA extends Thread {
private HasSelPrivateNum numRef;
public ThreadA(HasSelPrivateNum numRef) {
super();
this.numRef = numRef;
}
@Override
public void run() {
super.run();
numRef.addI("a");
}
}
(3)ThreadB.java
public class ThreadB extends Thread {
private HasSelPrivateNum numRef;
public ThreadB(HasSelPrivateNum numRef) {
super();
this.numRef = numRef;
}
@Override
public void run() {
super.run();
numRef.addI("b");
}
}
(4)Run.java
public class Run {
public static void main(String[] args) {
//注意这里是两个对象!!!
HasSelPrivateNum numRef1 = new HasSelPrivateNum();//对象1
HasSelPrivateNum numRef2 = new HasSelPrivateNum();//对象2
ThreadA a = new ThreadA(numRef1);
a.start();
ThreadB b = new ThreadB(numRef2);
b.start();
}
}
运行结果
原理图(多个对象多个锁)
总结
-
看到运行结果是异步进行的,前面说过了
synchronized
关键字是得到的对象锁,这里创建了2个对象,所以产生了两个锁,各自执行,也就没有了同步的效果。 -
如果是
synchronized
关键字加上static
关键字,那么得到的不再是对象锁,而是类锁!!下一篇说明这种情况多线程+单对象+synchronized+static。