java ReentrantLock应用

[b]java ReentrantLock应用[/b]

ReentrantLock可重入锁

1.使用ReentrantLock接口要比使用synchronized关键字效率高一些


[b]不公平锁与公平锁的区别:[/b]
private ReentrantLock lock = new ReentrantLock(); //参数默认false,不公平锁
private ReentrantLock lock = new ReentrantLock(true); //公平锁

1.公平情况下,操作会排一个队按顺序执行,来保证执行顺序。(会消耗更多的时间来排队)
2.不公平情况下,是无序状态允许插队,jvm会自动计算如何处理更快速来调度插队。(如果不关心顺序,这个速度会更快)


[b]例子:[/b]
import java.util.concurrent.locks.ReentrantLock;

public class addI extends Thread {
private static int i = 0;
private static ReentrantLock reentrantLock = new ReentrantLock();
private int threadId = 0;

@Override
public void run() {
//等待一个一个
try {
reentrantLock.lock();
i++;
} catch (Exception e) {
e.printStackTrace();
} finally {
// 解锁
reentrantLock.unlock();
}

//如果已加锁,则不再重复加锁
// if (reentrantLock.tryLock()) { //如果得不到锁就直接不执行
// try {
// i++;
// } catch (Exception e) {
// e.printStackTrace();
// } finally {
// // 解锁
// reentrantLock.unlock();
// }
// }

//如果发现该操作已经在执行,则尝试等待一段时间,等待超时则不执行(尝试等待执行)(实际应用会比较多用这种方式)
// try {
// //如果已经被lock,尝试等待5s,看是否可以获得锁,如果5s后仍然无法获得锁则返回false继续执行
// if (reentrantLock.tryLock(5, TimeUnit.SECONDS)) {
// try {
// i++;
// }catch (Exception e) {
// e.printStackTrace();
// } finally {
// // 解锁
// reentrantLock.unlock();
// }
// }
//
// } catch (InterruptedException e) {
// e.printStackTrace(); //当前线程被中断时(interrupt),会抛InterruptedException
// }

//可中断锁
// try {
// reentrantLock.lockInterruptibly(); //可以用线程的.interrupt()接口打断
// //操作
// } catch (InterruptedException e) {
// e.printStackTrace();
// } finally {
// reentrantLock.unlock();
// }

System.out.println("threadId = " + threadId + " i= " + i);
}

public addI(int threadId) {
super();
this.threadId = threadId;
}
}


public class ReentrantLockTest {
public static void main(String[] args) {
Thread thread[] = new Thread[10];
for (int i = 0; i < 10; i++) {
thread[i] = new addI(i);
}
for (int i = 0; i < 10; i++) {
thread[i].start();
}
}
}



参考原文:[url]http://blog.csdn.net/woaieillen/article/details/8046876[/url]
参考原文:[url]http://www.cnblogs.com/xiaorenwu702/p/3975916.html[/url]
参考原文:[url]https://my.oschina.net/andylucc/blog/651982[/url]

你可能感兴趣的:(Java)