- 多个对象多个锁
package testSynchronized;
public class Task {
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(1000);
}else{
num = 200;
System.out.println("b set over");
}
System.out.println(username +" num = "+num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package testSynchronized;
public class Task {
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(1000);
}else{
num = 200;
System.out.println("b set over");
}
System.out.println(username +" num = "+num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package testSynchronized;
public class ThreadB extends Thread {
private Task task;
public ThreadB(Task task){
this.task = task;
}
@Override
public void run() {
task.addI("b");
}
}
package testSynchronized;
public class Main {
public static void main(String[] args) {
Task task = new Task();
ThreadA threada = new ThreadA(task);
ThreadB threadb = new ThreadB(task);
threada.start();
threadb.start();
}
}
运行结果:
a set over
a num = 100
b set over
b num = 200
结果:在多个线程访问 同一对象(只有一个锁)的同步方法时一定是线程安全的。
那么多个对象多个锁的情况呢?
package testSynchronized;
public class Main {
public static void main(String[] args) {
//Task task = new Task();
ThreadA threada = new ThreadA(new Task());//每个线程多有自己的Task实例对象
ThreadB threadb = new ThreadB(new Task());
threada.start();
threadb.start();
}
}
运行结果:
b set over
a set over
b num = 200
a num = 100
本示例中两个线程分别访问同一个类的两个不同的实例的相同名称的同步方法,,效果是以异步的方式运行的。因为本实例中创建了2个任务对象(Task对象),所以会产生2个锁,threada和threadb线程分别获得各自Task实例的对象锁,所以可以异步执行。