Lock和Synchronized的功能类似,都可以实现线程的同步,但是Lock比Synchronized方式更加面向对象,与生活中的锁类似,这个Lock锁是上在代表要操作的资源的类的内部方法中,而不是线程代码中,它可以更优雅的处理线程同步问题。
测试:
public class LockTest { public static void main(String[] args) { final ShowName showName = new ShowName(); /*创建第一个线程*/ new Thread(new Runnable(){ @Override public void run() { while(true){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } showName.display("李克强"); } } }).start(); /*创建第二个线程*/ new Thread(new Runnable(){ @Override public void run() { while(true){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } showName.display("习近平"); } } }).start(); } static class ShowName{ /*创建一个锁*/ Lock lock = new ReentrantLock(); public void display(String name){ int len = name.length(); /*上锁*/ lock.lock(); try{ for(int i=0;i<len;i++){ System.out.print(name.charAt(i)); } System.out.println(); }finally{ /*解锁【这句代码,一定要放在finally中,以防锁住的代码抛出异常而发生死锁】*/ lock.unlock(); } } } }
成上面程序所得的结果可以看出:Lock可以实现和Synchronized同样的效果,而且很好理解。