JAVA-多线程同步的两大方式+对象锁和全局锁+wait()&notify()

1、synchronize:同步代码块,同步方法
    同步代码块:必须设置锁定的对象,一般使用this
    如synchronized(this){...} //表示为该程序的逻辑上锁。
    同步方法:public synchronized void sale(){...}
    由于必须同步进行,所以执行速度回很慢
    P.S:synchronized (this)和非static 的synchronized方法,只能防止多线程同时执行单一个对象,所以synchronized实质是锁对象。
     解决方法:
    (1)、锁同一个对象
    (2)、全局锁,锁class类:
              class sync{
                    public void test(){    
                         synchronized(this.class){...}
                }
        }
总结:出现锁不住的原因其实是出现了多对象。拿门举例子,锁不住是因为系统直接造了三扇门(class对象),三扇门内各有一个进程。要想锁住,直接规定只让造一扇门synchronized(this.class)

2、Lock:由JDK1.5提供。
死锁形成的原因:成环。各个成立的条件互相耦合。A->B->C->A
有上锁就要解锁,lock()与unlock()相互配合
使用方法:程序名.lock();    程序名.unlock();  优先使用synchronized();

对象锁:当一个对象中有synchronized方法或synchronized block时调用此对象的同步方法或进入同步区域时,必须等待对象所释放。

全局锁:出现锁不住的原因其实是出现了多对象。拿门举例子,锁不住是因为系统直接造了三扇门(class对象),三扇门内各有一个进程。要想锁住,直接规定只让造一扇门synchronized(this.class)


1、wait():     作用:使线程停止运行       归类:object类方法
P.S:只能在同步方法或同步块中调用,如用wait()时候,没有适当的锁的话,就会跑出异常,执行wait();之后,会释放当前的线程的锁,由其余线程竞争获得锁。
进程如果不notify的话,则会一直等待下去。不会主动唤醒。
2、notify():    作用:使停止的线程继续运行(与wait()相互配合使用)
                    (1)、要在同步方法或同步快中调用。
                         (2)、若同时有多个线程处于wait()状态,则notify随意挑一个程序唤醒。此随意由JVM决定。
                    (3)、nitify之后,不会马上释放该对象锁,会等待执行notify的同步代码走完之后,才会释放对象锁。
        要想一次唤醒所有线程,则使用notifyAll();
P.S: 要注意notify方法的执行顺序必须在wait之后,不然的话wait程序遇不到notify命令则会一直等待下去。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值