锁对象改变问题
引自:Java多线程编程核心技术
如果多个线程同时持有相同的锁对象,那么线程之间就是同步的;如果分别获得锁对象,这些线程之间就是异步的.
理解:
- 如果多个线程同时申请一个对象的锁,那么这些线程就根据CPU进行调度,先获得锁的先执行,其它的线程继续等待这个线程执行完毕.如方法二,tha和thb线程同时申请"A锁"对象的锁,所以同步执行.
- 如果多个线程分别申请不同的对象那么就将异步执行,例如方法一,tha.start()调用之后将lock对象修改,那么thb.start()就是申请的修改后对象的锁,所以异步执行.
方法一:正常执行
方法二:将注释部分拿出来一块执行
package com.meng.thread;
public class Myservice {
private String lock = "A锁";
public void TestLock(){
synchronized (lock){
System.out.println(Thread.currentThread().getName() + "begin" + System.currentTimeMillis());
lock = "换锁了";
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "end" + System.currentTimeMillis());
}
}
}
class ThreadA extends Thread{
private Myservice service;
public ThreadA(Myservice service) {
this.service = service;
}
@Override
public void run() {
super.run();
service.TestLock();
}
}
class ThreadB extends Thread{
private Myservice service;
public ThreadB(Myservice service) {
this.service = service;
}
@Override
public void run() {
super.run();
service.TestLock();
}
}
class Test{
public static void main(String[] args) {
Myservice myservice = new Myservice();
ThreadA tha = new ThreadA(myservice);
tha.setName("A");
ThreadB thb = new ThreadB(myservice);
thb.setName("B");
tha.start();
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
thb.start();
}
}