再来看一个实验:
上面代码中有同步方法addI,说明此方法应该被顺序调用,创建两个线程类:
运行类:
创建了两个HasSelfPrivateNum类的对象,运行结果:
上面实验是两个线程分别访问同一个类的两个不同实例的相同名称的同步方法,效果却是以异步的方式运行的。本实例由于创建了2个业务对象,在系统中产生出2个锁所以运行的结果是异步的,打印的效果就是先打印b,然后打印a。
从上面的运行结果看,虽然在HasSelfPrivateNum中使用了synchronized关键字,但打印的顺序却不是同步的,是交叉的,为什么是这样的结果呢?
关键字取得的锁都是对象锁,而不是把一段代码或者方法当做锁,所以在上面的示例中,哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁Lock,那么其它线程只能呈等待状态,前提是多个线程访问的是同一个对象。
但是如果多个线程访问多个对象,那么JVM就会创建多个锁。上面的示例就是创建了2个锁。
同步的单词为synchronized,异步的单词为asynchronized。