synchronized是基于jvm底层实现的数据同步,lock是基于Java编写,主要通过硬件依赖CPU指令实现数据同步。
-
1.Synchronized同步方法体和同步代码块的使用
public synchronized void method01(){ //方法体 } public void method02(){ synchronized (this) { //一次只能有一个线程进入 } }
-
2.lock锁的简单运用
public class TestLock { public static void main(String[] args) { TestLock2 testLock2 = new TestLock2(); new Thread(testLock2,"我").start(); new Thread(testLock2,"小明").start(); new Thread(testLock2,"老师").start(); } } class TestLock2 implements Runnable{ int ticketNums=1000; //定义lock锁 private final ReentrantLock lock=new ReentrantLock(); @Override public void run() { while (true){ lock.lock(); //加锁 try { if (ticketNums>0){ // try { // Thread.sleep(10); // } catch (InterruptedException e) { // e.printStackTrace(); // } System.out.println(Thread.currentThread().getName()+" "+ticketNums--); }else { break; } }finally { lock.unlock(); //解锁 } } } }
-
3.特性比较
Synchronized Lock 层次 是java关键字,在jvm层次 基于java的一个接口 锁的类型 可重入、不可中断、非公平 可重入、可公平、可中断 锁的获取 一个线程获得锁后,其他线程需要等待 多种获得方式,如lock 锁释放 执行完线程释放或者发生异常jvm让线程释放 unlock方法(一般在finally中释放) 优缺点 优点:实现简单,语义清晰,便于JVM堆栈跟踪,加锁解锁过程由JVM自动控制,提供了多种优化方案,使用广泛。
缺点:悲观的排他锁,功能单一。优点:可定时的、可轮询的与可中断的锁获取操作,提供了读写锁、公平锁和非公平锁
缺点:需手动释放锁unlock,不适合JVM进行堆栈跟踪