JAVA多线程——锁Lock

tech2023-02-16  97

JAVA多线程——锁Lock

Lock是一个接口,是在JUC包下的,Lock接口是控制多个线程对共享资源进行访问的工具。每次只能有一个线程拿到Lock对象的锁,线程开始访问共享资源前应先获得Lock对象。

不加锁,线程不安全

package com.peng.lock; import java.util.concurrent.locks.ReentrantLock; //测试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 = 10; @Override public void run() { while (true){ if (ticketNums>0){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(ticketNums--); }else { break; } } } }

加了锁后,实现了并发编程

package com.peng.lock; import java.util.concurrent.locks.ReentrantLock; //测试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 = 10; // 定义lock锁 ReentrantLock是Lock接口的实现类 private final ReentrantLock lock = new ReentrantLock(); @Override public void run() { while (true){ try{ //加锁,在要变化的量加锁 lock.lock(); if (ticketNums>0){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(ticketNums--); }else { break; } }finally { //解锁 把解锁放在finally里 lock.unlock(); } } } }

synchronized和Lock的对比

Lock是显示锁,需要手动开启和关闭,synchronized是隐式锁,出了作用域(作用域:方法或代码块)自动释放Lock只有代码块锁,synchronized有方法锁和代码块锁使用Lock锁,JVM将花费较少的时间来调度线程,性能更好,并且具有较好的扩展性,提供更多子类(如ReentrantLock类)

优先使用顺序:Loc>同步代码块(在方法体内用,已经分配了资源)>同步方法(在方法体外使用)

最新回复(0)