当前位置: 首页 > news >正文

长沙模板建站源码群晖ds1817做网站

长沙模板建站源码,群晖ds1817做网站,想开个网站怎样开,大型电商网站开发规划1 Lock锁介绍已经在【JUC基础】04简单介绍过了,本文做进一步的拓展,比如公平锁和非公平锁、📌 明白锁的核心四个对象:线程,共享资源,锁,锁操作包括线程如何操作资源,使用锁锁哪个资源…

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 (number==0){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执行完调用B,B执行完调用C,C执行完调用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();}}
}

控制台输出:

http://www.yayakq.cn/news/943438/

相关文章:

  • 百度快照是怎么做上去的seo优化有哪些
  • 网站怎么做404 301怎样做元古建筑的网站结构图
  • 如何做公司的英文网站网站容易做吗
  • 免费做外贸的网站平台河南省建设执业资格中心网站
  • 南京个人网站建设wordpress免费 360插件
  • 网站后台 js框架网站开发的基本流程和步骤
  • 郑州营销网站黑群晖 frp wordpress 访问
  • 西安网站开发培训价格有什么做旅游攻略的网站好
  • 八年级信息网站怎么做wordpress添加可链接照片
  • 网站建设法律可行性河北建设集团
  • 延边州建设厅网站北京群体性聚集
  • 做网站成功的企业自己制作公司官网
  • 网站设计的公司价格文档里链接网站地址怎么做
  • 哪个公司搭建网站网站建设需求模版
  • 网站制作比较好的公司英文网站建设 淮安
  • 家具类网站如何优化惠州市seo网站设计
  • 雷达图 做图网站大理网站制作
  • 网站推广网络营销重庆装修房子可以提取公积金吗
  • 福田网站建设 信科网络文明网站建设方案
  • 网站维护一年一般多少钱做理财的网站有哪些问题
  • 中国智慧城市建设门户网站定陶网站建设
  • 文登住房与建设局网站建设银行官网招聘网站
  • 网站优化和推广方案ppt做网站买域名
  • mc做地图画网站中国十大软件外包公司排名
  • 网站数据分析wordpress简体中文下载地址
  • 怎么做文化传媒公司网站做俄罗斯外贸网站推广
  • 看守所加强自身网站建设工作天津建设工程信息网评标专家怎么查询评审项目
  • 十堰秦楚网 十堰新闻门户网站购买了个网站源码 怎么建立
  • 网站竞价推广怎么做新乡彩票网站建设
  • 做素材类的网站赚钱吗企业网站建设解决方案