package com.fank.multifythread.test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
*
* @author Fanxk
* @Date 2018年3月21日
* @Version 1.0
*/
public class LockTest
{
/**
* lock()方法是平常使用得最多的一个方法,就是用来获取锁。如果锁已被其他线程获取,
* 则进行等待。由于在前面讲到如果采用Lock,必须主动去释放锁,并且在发生异常时,
* 不会自动释放锁。因此一般来说,使用Lock必须在try{}catch{}块中进行,并且将
* 释放锁的操作放在finally块中进行,以保证锁一定被被释放,防止死锁的发生。
*/
private static List<Integer> arrayList = new ArrayList<Integer>();
static Lock lock = new ReentrantLock();
public static<E> void main(String[] args)
{
new Thread()
{
public void run(){
Thread thread = Thread.currentThread();
lock.lock();
try
{
System.out.println(thread.getName()+"得到了锁");
for (int i = 0; i < 5; i++)
{
arrayList.add(i);
}
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
System.out.println(thread.getName()+"释放了锁");
System.out.println("-----------------");
//如果注释了,下面代码的就不会执行
lock.unlock();
}
};
}.start();
new Thread()
{
public void run()
{
Thread thread = Thread.currentThread();
lock.lock();
try
{
System.out.println(thread.getName()+"得到了锁");
for (int i = 0; i < 5; i++)
{
arrayList.add(i);
}
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
System.out.println(thread.getName()+"释放了锁");
System.out.println("-=-=-=--=ddddddd-----");
lock.unlock();
}
}
}.start();
}
}
//******************************************************分割线***************************************************//
package com.fank.multifythread.test;
import java.util.ArrayList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
*观察现象:一个线程 获得锁后,另一个线程取不到锁,不会一直等待
*tryLock()
* @author Fanxk
* @Date 2018年3月21日
* @Version 1.0
*/
public class LockTest_0
{
/**
* tryLock()方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,
* 如果获取失败(即锁已被其他线程获取),则返回false,
* 也就说这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。
*
*
*
* tryLock(long time,TimeUtil unit)
* tryLock(long time, TimeUnit unit)方法和tryLock()方法是类似的,
* 只不过区别在于这个方法在拿不到锁时会等待一定的时间,在时间期限之内如果还拿不
* 到锁,就返回false。如果如果一开始拿到锁或者在等待期间内拿到了锁,则返回true。
*/
private static ArrayList<Integer> arrayList = new ArrayList<Integer>();
static Lock lock = new ReentrantLock();
public static void main(String[] args){
new Thread(){
public void run(){
Thread thread = Thread.currentThread();
boolean tryLock = lock.tryLock();
System.out.println(thread.getName()+" "+tryLock);
if(tryLock)
{
try
{
System.out.println(thread.getName()+" "+"得到了锁");
for (int i = 0; i < 5; i++)
{
arrayList.add(i);
}
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
System.out.println(thread.getName()+"释放了锁");
lock.lock();
}
}
}
}.start();
new Thread(){
public void run(){
Thread thread = Thread.currentThread();
boolean tryLock = lock.tryLock();
System.out.println(thread.getName()+" "+tryLock);
if(tryLock)
{
try
{
System.out.println(thread.getName()+" "+"得到了锁");
for (int i = 0; i < 5; i++)
{
arrayList.add(i);
}
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
System.out.println(thread.getName()+"释放了锁");
lock.lock();
}
}
}
}.start();
}
}
线程锁的应用
最新推荐文章于 2024-07-09 15:38:01 发布