1.使用ReentrantLock类:
private Lock ticklock=new ReentrantLock();
调用ReentrantLock对象的lock()方法获取锁,调用unlock()方法释放锁。
范例:
public class MyThread{
private Lock lock=new ReentrantLock();
public void TestMethod(){
lock.lock(); //得到对象锁
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+i);
}
lock.unlock(); //释放对象锁
}
}
2.使用ReentrantLock实现同步
以卖票为例:
class MyThread implements Runnable{
private int ticket=10;
private Lock lock=new ReentrantLock();
@Override
public void run() {
for(int i=0;i<10;i++)
{
lock.lock(); //获取对象锁
try {
if(this.ticket>0)
{
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(Thread.currentThread().getName()+"还有"+this.ticket--+"张票");
}
} finally {
lock.unlock(); //释放对象锁
}
}
}
}
测试代码:
public class Test1 {
public static void main(String[] args) throws InterruptedException {
MyThread myThread=new MyThread();
Thread thread=new Thread(myThread,"黄牛A");
Thread thread1=new Thread(myThread,"黄牛B");
thread.start();
thread1.start();
}
}
打印结果:
3.使用Condition实现等待/通知:
关键字synchronized与wait()和notify()/notifyAll()方法结合可以实现等待/通知模式,类ReentratLock也可以实现同样的功能,借助于Conditiond对象。
class MyService
{
private Lock lock=new ReentrantLock(); //创建Lock对象
public Condition condition=lock.newCondition(); //创建Condition对象
public void await()
{
try {
lock.lock();
System.out.println("await时间为:"+System.currentTimeMillis());
condition.await();
} catch (Exception e) {
// TODO: handle exception
}finally {
lock.unlock();
}
}
public void signal()
{
try {
lock.lock();
System.out.println("await时间为:"+System.currentTimeMillis());
condition.await();
} catch (Exception e) {
// TODO: handle exception
}finally {
lock.unlock();
}
}
}
class MyThread extends Thread{
private MyService myserice;
public MyThread(MyService myserice) {
super();
this.myserice = myserice;
}
@Override
public void run() {
myserice.await();
}
}
public class Test1 {
public static void main(String[] args) throws InterruptedException {
MyService myService=new MyService();
MyThread myThread=new MyThread(myService);
myThread.start();
Thread.sleep(1000);
myService.signal();
}
}
运行结果:
会打印两条一样的时间。
在上述代码中:
Object类中的wait方法相当于Condition类中的await()方法。
Object类中的wait(long timeout)方法相当于Condition类中的await(long time,TimeUnit unit)方法。
Object类中的notify()方法相当于Condition类中的signal方法。
Object类中的notifyAll()方法相当于Condition类中的signalAll()方法。