0301-同步锁二(Lock)

文章介绍了Java中同步锁的三种使用方式,包括在方法上直接声明`synchronized`,通过`this`关键字作为锁对象,以及从JDK5开始引入的`Lock`接口和`ReentrantLock`实现类。通过示例展示了如何使用`ReentrantLock`进行加锁和解锁操作,确保多线程环境下的线程安全。
摘要由CSDN通过智能技术生成
  • 同步锁的使用方式二

可以直接在方法上声明:

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();
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值