网站主机建设方案,手机网站打开很慢,榆林华科网站建设,网络营销网络推广1 Lock锁介绍已经在【JUC基础】04简单介绍过了#xff0c;本文做进一步的拓展#xff0c;比如公平锁和非公平锁、#x1f4cc; 明白锁的核心四个对象#xff1a;线程#xff0c;共享资源#xff0c;锁#xff0c;锁操作包括线程如何操作资源#xff0c;使用锁锁哪个资源…1 Lock锁介绍已经在【JUC基础】04简单介绍过了本文做进一步的拓展比如公平锁和非公平锁、 明白锁的核心四个对象线程共享资源锁锁操作包括线程如何操作资源使用锁锁哪个资源锁让谁等待谁唤醒这是我们在加锁时需要考虑的 synchronized 与Lock区别synchronized是一个关键字lock是一个类synchronized自动释放锁lock需要手动释放synchronized线程1获得了锁进入阻塞线程2会死等。lock不会synchronized非公平lock可以使用公平锁synchronized适合锁少量代码同步问题lock适合锁大量同步代码 Lock重点Lock接口的实现类均需要主动加锁和解锁主要有三个实现类ReentrantLock最常用2 公平锁和非公平锁 要点公平锁必须先来后到十分公平非公平锁允许插队默认-为了效率以下是ReentrantLock的构造方式synchronized默认也是非公平锁 代码举例首先在主线程中启动一个T线程给他上锁休眠2秒在它释放锁之前启动一个T1线程T1线程中创建10个B线程因为T已经上锁了那么后边的A线程就必须等T1线程启动后才能获取锁但是10个B线程已经排在了10个B线程后边在主线程中再启动10个A线程获取锁此时可观察公平锁和非公平锁的具体情况。公平锁B线程一直再A线程后边非公平锁B线程可能会插队到A线程前边public class testLock {public static void main(String[] args) throws InterruptedException {test1(false);//非公平锁
// test1(true);//公平锁}public static void test1(boolean fair) throws InterruptedException {ReentrantLock lock new ReentrantLock(fair);new Thread(() - {lock.lock();try {System.out.println(start);try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() - {create10T(lock, B);},T1).start();System.out.println(end);} finally {lock.unlock();}},T).start();create10T(lock, A);}public static void create10T(ReentrantLock lock, String threadPre) {for (int i 0; i 10; i) {Thread thread new Thread(() - {lock.lock();try {System.out.println(Thread.currentThread().getName()获取到锁!);} finally {lock.unlock();}});thread.setName(threadPre - i);thread.start();}}
}非公平锁公平锁3 Lock版的生产者消费者问题 Condition 通知和唤醒线程Condition是个接口基本的方法就是await()和signal()方法Conditon中的await()对应Object的wait()Condition中的signal()对应Object的notify()Condition中的signalAll()对应Object的notifyAll()。核心锁的condition执行await就是让该线程携带对应的condition进入等待队列当condition执行signal就是让携带该condition的线程唤醒使用于lock与unlock之间。3.1 Lock处理生产者消费者问题import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class LockPC {public static void main(String[] args) {Data data new Data();new Thread(()-{for (int i 0; i 5; i) {try {data.plus();} catch (InterruptedException e) {e.printStackTrace();}}},A).start();new Thread(()-{for (int i 0; i 5; i) {try {data.minus();} catch (InterruptedException e) {e.printStackTrace();}}},B).start();new Thread(()-{for (int i 0; i 5; i) {try {data.plus();} catch (InterruptedException e) {e.printStackTrace();}}},C).start();new Thread(()-{for (int i 0; i 5; i) {try {data.minus();} catch (InterruptedException e) {e.printStackTrace();}}},D).start();}
}class Data{//资源类private int number 0;Lock lock new ReentrantLock();Condition condition lock.newCondition();//1public void plus() throws InterruptedException {lock.lock();try {while (number!0){condition.await();//等待}number;System.out.println(Thread.currentThread().getName()number);condition.signalAll();//通知其他线程1结束} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}//-1public void minus() throws InterruptedException {lock.lock();try {while (number0){condition.await();//等待}number--;System.out.println(Thread.currentThread().getName()number);condition.signalAll();//通知其他线程-1结束} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}
}控制台输出3.2 Condition 精准通知和唤醒线程import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;//A执行完调用BB执行完调用CC执行完调用A
public class LockCondition {public static void main(String[] args) {Data2 data new Data2();new Thread(()-{for (int i 0; i 5; i) {data.pringtA();}},A).start();new Thread(()-{for (int i 0; i 5; i) {data.pringtB();}},B).start();new Thread(()-{for (int i 0; i 5; i) {data.pringtC();}},C).start();}
}class Data2{private Lock lock new ReentrantLock();private Condition condition1 lock.newCondition();private Condition condition2 lock.newCondition();private Condition condition3 lock.newCondition();private int number 1; //1A、2B、3Cpublic void pringtA(){lock.lock();try { //业务判断-执行-通知while (number!1){condition1.await();}System.out.println(Thread.currentThread().getName()number);//唤醒指定的Bnumber 2;condition2.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void pringtB(){lock.lock();try {while (number!2){condition2.await();}System.out.println(Thread.currentThread().getName()number);//唤醒指定的Bnumber 3;condition3.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void pringtC(){lock.lock();try {while (number!3){condition3.await();}System.out.println(Thread.currentThread().getName()number);//唤醒指定的Bnumber 1;condition1.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
}控制台输出