——— android培训、java培训、期待与您交流! ———
理解同步
多线程使得多个任务可以并行执行,提高了工作效率。但同时产生了一个问题,因为线程间过快的切换,对资源的同时访问产生拥堵。就好像,大家都要进一个小巷里去,但小巷只容一人通过,结果第一个人刚要进去,第二个人也进去,两个人就挤在了一起,堵住了,出错了。
实现
要实现线程同步有两种方法:
- 关键字sunchronized
- 同步锁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();
}