面试问到synchronized与Lock区别?

synchronized(以下用sync表示)与lcok区别?

	1.原始构成:
				sync是关键字属于jvm层面。
				     (monitorenter底层是通过monitor对象来完成)
				Lock是具体类是api层面的锁
	
	2.使用方法:
				sync不需要手动释放锁,当sync代码执行完成后系统自动让出线程释放对锁的占用
				ReentrantLock则需要用户手动释放锁,有可能出现死锁
				需要lock() 和unlock()方法配合try/finally语句块来完成
				
				
	3.等待是否可断:
				sync不可中断,除非抛出异常或结束
				RccntrantLock 可中断 
					 1.设置超时方法trylock
					 2.lockInterruptubly
	4.加锁是否公平:
				sync非公平锁
				ReentrantLock都可以,默认非公平锁
					
	5.锁绑定多个条件condition
				sync没有
				ReentrantLock用来实现分组唤醒需要唤醒的线程
/*
* 题目多线程间顺序调用   实现A->B->C
* AA打印5次,BB打印10次,CC打印15次
* 接着
* AA打印5次,BB打印10次,CC打印15次
* .........
* 来十轮
* 
* */


class ShareResource{
	
	private int number =1;
	
	private Lock lock =new ReentrantLock();
	private Condition c1 = lock.newCondition();
	private Condition c2 = lock.newCondition();
	private Condition c3 = lock.newCondition();
	
	public void print5() {
		
		 lock.lock();
	        try {
	            //判断
	            while (number != 1){

	                c1.await();
	            }
	            //2 干活
	            for (int i = 1; i < 5; i++) {
					
	            	System.out.println(Thread.currentThread().getName()+"\t"+i);
				}

	            //3 通知
	            number = 2;
	            c2.signal();
	        }catch (Exception e){
	            e.printStackTrace();
	        }finally {
	        	lock.unlock();
	        }
	}
	
	public void print10() {
		
		 lock.lock();
	        try {
	            //1 判断
	            while (number != 2){

	                c2.await();
	            }
	            //2 干活
	            for (int i = 1; i < 10; i++) {
					
	            	System.out.println(Thread.currentThread().getName()+"\t"+i);
				}

	            //3 通知
	            number = 3;
	            c3.signal();
	        }catch (Exception e){
	            e.printStackTrace();
	        }finally {
	        	lock.unlock();
	        }
	}
	
	
	
	public void print15() {
		
		 lock.lock();
	        try {
	            //判断
	            while (number != 3){

	                c3.await();
	            }
	            //2 干活
	            for (int i = 1; i < 15; i++) {
					
	            	System.out.println(Thread.currentThread().getName()+"\t"+i);
				}

	            //3通知
	            number = 1;
	            c1.signal();
	        }catch (Exception e){
	            e.printStackTrace();
	        }finally {
	        	lock.unlock();
	        }
	}
	
}


public class SyncAndReentrantLockDemo {
	
	public static void main(String[] args) {
		
	ShareResource shareResource = new ShareResource();
	
	new Thread( ()->  {
		for (int i = 1; i <= 10; i++) {
			
			try {
				shareResource.print5();
				
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}
	},"AA").start();

	
	new Thread( ()->  {
		for (int i = 1; i <= 10; i++) {
			
			try {
				shareResource.print10();
				
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}
	},"BB").start();

	
	new Thread( ()->  {
	
		for (int i = 1; i <= 10; i++) {
			
			try {
				shareResource.print15();
				
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}
	},"CC").start();

	}
}

面试问到synchronized与Lock区别?_第1张图片

你可能感兴趣的:(菜鸟部落)