Java 多线程, 同步访问, 线程锁,锁对象,ReentrantLock,synchronized

1.为什么要同步访问数据?

  当两个或以上的线程需要共享对同一数据的存取,可能会发生共享数据的讹误。

2.实现同步的方式

  2.1 ReentrantLock类

    School类:

        class School{
        
            private int stuNum;
            private Lock lock;
       private Condition condition;
        
            public School(int stuNum) {
                this.stuNum = stuNum;
                lock = new ReentrantLock();
                condition = lock.newCondition();
            }
        ......

    其中 lock是锁对象, condition 是条件对象,

    用法:

        public void stuNums1(){
            lock.lock();
            try{
                while (stuNum < 20){
                    System.out.println(stuNum+" < 20,等待数量变为20");
                    condition.await();
                }
                stuNum -= 5;
                System.out.println(Thread.currentThread().toString() + ":" + stuNum);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }

        }
        public void stuNums2(){
            lock.lock();
            try{
                stuNum += 1;
                System.out.println(Thread.currentThread().toString() + ":" + stuNum);
                if (stuNum >= 20){
                    System.out.println(stuNum + ">20了,开始唤醒等待集的线程");
                    condition.signalAll();
                }
            } finally {
                lock.unlock();
            }

        }

    当条件对象调用await()方法时候,当前线程会进入等待集,处于阻塞状态,直到其他线程在同一条件上调用signalAll()方法为止。

    当一个线程调用await()方法时候,没有办法重新激活自身,寄希望于其他线程,如果没有其他线程重新激活等待中的线程,将会导致死锁。

    在对象状态有利于等待线程的方向改变时调用signalAll()方法,解除等待线程的阻塞。

  2.2 synchronized关键字

    在声明方法时,加上这个关键字,对象锁会保护整个方法。其效果等价于2.1中的方法。

    在这里  wait() notufyAll() 分别等价于 await() signalAll()方法。

 

转载于:https://www.cnblogs.com/lovleo/p/11318623.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值