java ReentrantLock应用

java ReentrantLock应用

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


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

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


例子:
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();
		}
	}
}




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

猜你喜欢

转载自huangyongxing310.iteye.com/blog/2327073