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