- 同步锁的使用方式二
可以直接在方法上声明:
public synchronized void add();
等价于:
public class A{
public synchronized void add(){
}
}
=========》
这种方式相当锁对象是this:
public class A{
public void add(){
synchronized(this){
}
}
}
PS:对于 Vector 来说,多个线程同时操作一个 Vector 对象,调用其 add 方法时,是以同步方式保存对象。称为:线程安全。
- 同步锁的使用方式三(JDK5)
在 JDK1 的线程时,锁对象类型是 Object 。表示任意类型都可以做为锁对象。
实际开发时,一般使用临界资源对象做为锁对象。
到了 JDK5,就专门创建了一个锁对象。
java.util.concurrent.locks.Lock //接口
public interface Lock {
//此方法为上锁
void lock();
//此方法为解锁
void unlock();
}
此锁接口的实现类:
java.util.concurrent.locks.ReentrantLock //实现类
public class ReentrantLock implements Lock, java.io.Serializable{
}
创建一个锁对象的方式:
Lock lock = new ReentrantLock();
修改之前的 synchronized 锁的写法:
public class DepositRunnable implements Runnable {
private AcountService service = new AcountService();
private Acount acount;
private Double money;
private Lock lock;//锁对象
//使用构造方法传入锁对象
public DepositRunnable(Acount acount, Double money, Lock lock) {
this.acount = acount;
this.money = money;
this.lock = lock;
}
@Override
public void run() {
lock.lock();//加锁
System.out.println(Thread.currentThread().getName() + "-存款任务开始!");
service.deposit(acount, money);
System.out.println(Thread.currentThread().getName() + "-存款成功!" + acount.getMoney());
System.out.println(Thread.currentThread().getName() + "-存款任务结束!");
lock.unlock();//解锁
}
}
在测试类中的写法:
public class Test {
public static void main(String[] args) {
Lock lock = new ReentrantLock();//实例化锁对象
Acount acount = new Acount(10000.0);//临界资源
//创建任务对象并传入锁对象
DepositRunnable depositRunnable01 = new DepositRunnable(acount,10000.0,lock);
DepositRunnable depositRunnable02 = new DepositRunnable(acount,2000.0,lock);
//此处还未传入锁对象所以无法实现同步操作
DrawRunnable drawRunnable01 = new DrawRunnable(acount,5000.0);
DrawRunnable drawRunnable02 = new DrawRunnable(acount,5000.0);
Thread t1 = new Thread(depositRunnable01,"自己");
Thread t2 = new Thread(depositRunnable02,"父母");
Thread t3 = new Thread(drawRunnable01,"女儿");
Thread t4 = new Thread(drawRunnable02,"老婆");
t1.start();
t2.start();
t3.start();
t4.start();
}
}