黑马程序员——Java基础---多线程同步

——— android培训java培训、期待与您交流! ———

理解同步

多线程使得多个任务可以并行执行,提高了工作效率。但同时产生了一个问题,因为线程间过快的切换,对资源的同时访问产生拥堵。就好像,大家都要进一个小巷里去,但小巷只容一人通过,结果第一个人刚要进去,第二个人也进去,两个人就挤在了一起,堵住了,出错了。

实现

要实现线程同步有两种方法:

  1. 关键字sunchronized
  2. 同步锁Lock

两种方法的使用方式基本相同,具体实现如下。

同步关键字:synchronized

有两种用法,同步代码块和同步方法。

/**
 * 在方法中将涉及修改共享资源的代括起,定义成同步代码块
 */
public void run()
{
    //同步代码块
    synchronized(obj) 
    {
        //执行内容
        ...
    }
}

/**
 * 同步方法,在方法名前加上sunchronized关键字定义成同步方法。
 */
public synchronized method()
{
    //执行内容
    ... 
}
  • wait()
    wait()方法使当前线程进入等待状态,有执行资格。此线程可以被其他线程的notify()方法唤醒。
  • notify()
    notify()方法使内核准备选择某个线程执行。

    代码

Thread thread = new Thread(new Runnable(){
    public void run()
    {
        ...
        notify();
        wait(); //此时线程停止,所有未执行完的线程都处于等        
                  待状态,内核开始选择线程。
    }
});

Thread thread = new Thread(new Runnable(){
    public void run()
    {
        ...
        wait();
    }
});

同步锁:Lock

同步锁使用Lock类创建锁对象,通过Condition类控制等待和唤醒。其余操作和synchronized相似。

Lock的锁方法:

  • lock() 开锁
  • unlock() 解锁

Condition的方法:

  • await() 相当于wait()方法
  • signal() 相当于notify()方法

具体使用方法如下:

Lock lock = new ReentrantLock();   //同步锁
Condition condition = lock.newCondition(); //控制wait和notify的类
condition.await();   // = wait()
condition.signal();  // = notify()

//常用操作
Lock lock = new Reentrantlock();
Condition condition = lock.newCondition();
run()
{
    lock.lock();

    while( ... )
    {
        condition.await();
    }

    ...

    condition.signal();

    lock.unlock();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值