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

大良建设幼儿园网站社群营销活动策划方案

大良建设幼儿园网站,社群营销活动策划方案,大连做网站电话,服装网站建设目的一、ReentranLock ReentranLock属于JUC并发工具包下的类,相当于 synchronized具备如下特点 ● 可中断 ● 可以设置超时时间 ● 可以设置为公平锁(防止线程出现饥饿的情况) ● 支持多个条件变量 与 synchronized一样,都支持可重…

一、ReentranLock

ReentranLock属于JUC并发工具包下的类,相当于 synchronized具备如下特点

● 可中断
● 可以设置超时时间
● 可以设置为公平锁(防止线程出现饥饿的情况)
● 支持多个条件变量

与 synchronized一样,都支持可重入

基本语法(synchronized在关键字级别保护临界区, reentrantLock是在对象的级别来保护临界区)

// 获取锁
reentrantLock.lock();
try {// 临界区
} finally {// 释放锁(无论是否出现异常,均会将锁释放)reentrantLock.unlock();
}

lock()与unlock()是成对出现的

1.1 可重入

可重入是指同一个线程对象如果首次获得这把锁,那么因为它是这把锁的拥有者,因此有权利再次获取这把锁
如果是不可重入锁,那么第二次获得锁时,自身也会被锁挡住

import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.locks.ReentrantLock;@Slf4j(topic = "c.Test")
public class Test {// 创建锁重入对象private static ReentrantLock lock = new ReentrantLock();public static void main(String[] args) throws InterruptedException {// 加锁lock.lock();try {log.debug("enter  main");m1();} finally {// 解锁lock.unlock();}}public static void m1() {// 加锁lock.lock();try {log.debug("enter  m1");m2();} finally {// 解锁lock.unlock();}}public static void m2() {// 加锁lock.lock();try {log.debug("enter  m2");} finally {// 解锁lock.unlock();}}
}

运行结果:(锁重入成功)

在这里插入图片描述

1.2 可打断——lockInterruptibly

在等待锁的过程中其他线程可以用interruput()方法终止等待

import cn.itcast.n2.util.Sleeper;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.locks.ReentrantLock;@Slf4j(topic = "c.Test")
public class Test {// 创建锁重入对象private static ReentrantLock lock = new ReentrantLock();public static void main(String[] args)  {Thread t1=new Thread(()->{try {// 尝试获取锁,但可以被打断(如果没有别的线程竞争锁,此方法就会获取lock对象上的锁)/*若有竞争进入阻塞队列等待*/log.debug("尝试获得锁");lock.lockInterruptibly();} catch (InterruptedException e) {e.printStackTrace();log.debug("没有获取锁,返回");return;}try {log.debug("获取到锁");}finally {// 将锁释放掉lock.unlock();}},"t1");// 主线程先对其进行加锁后,t1线程才启动lock.lock();t1.start();// 主线程睡眠1s后打断t1Sleeper.sleep(1);t1.interrupt();}
}

运行结果:(成功打断t1线程)

1.3 锁超时

锁超时:在获取锁的过程中,如果其他线程持有锁一直未释放,去尝试获取锁的线程也不会死等,而是等待一段时间,若这段时间超过对方仍未释放锁,则放弃等待,获取锁失败

可打断属于一种被动的避免无限等待(死等)方式;而锁超时以主动的方式避免死等

1、无其他线程竞争锁:

import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.locks.ReentrantLock;@Slf4j(topic = "c.Test")
public class Test {// 创建锁重入对象private static ReentrantLock lock = new ReentrantLock();public static void main(String[] args) {Thread t1 = new Thread(() -> {log.debug("尝试获得锁");// 尝试获取锁,返回值为布尔型  【成功:获取锁   失败:不可获得锁,不会进入阻塞队列等待】if (!lock.tryLock()) {           //失败则立刻返回(没有任何等待时间)log.debug("获取锁失败");    // falsereturn;}try {// 执行临界区代码log.debug("成功获取锁");} finally {lock.unlock();     // 释放锁}});}
}

运行结果:
在这里插入图片描述

2、存在其他线程竞争(立刻结束):

import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.locks.ReentrantLock;@Slf4j(topic = "c.Test")
public class Test {// 创建锁重入对象private static ReentrantLock lock = new ReentrantLock();public static void main(String[] args) {Thread t1 = new Thread(() -> {log.debug("尝试获得锁");// 尝试获取锁,返回值为布尔型  【成功:获取锁   失败:不可获得锁,不会进入阻塞队列等待】if (!lock.tryLock()) {log.debug("获取锁失败");    // falsereturn;}try {// 执行临界区代码log.debug("成功获取锁");} finally {lock.unlock();     // 释放锁}});// 主线程先对lock对象加锁lock.lock();log.debug("成功获取锁");t1.start();}
}

运行结果:
在这里插入图片描述

3、存在其他线程竞争(等待一段时间):尝试等待1s,1s内若主线程还未释放锁再结束
在这里插入图片描述

哲学家就餐问题便可以使用tryLock()解决

1.4 公平锁

ReentrantLock 默认是不公平的。当一个线程持有锁,其他线程就会进入阻塞队列等待,当锁的持有者释放锁时,阻塞队列中等待的线程会一拥而上,谁先争抢到锁谁便是Owner,而不会按进入阻塞队列的先后顺序先来先得

(通过查看源码发现其构造方法中有一个带boolean类型参数的方法,其参数fair默认为false,可以修改其布尔值保证其公平性)公平锁一般没有必要,会降低并发度

二、ReentranLock条件变量

2.1 简介

条件变量

synchronized 中也有条件变量,就是我们讲原理时那个 waitSet 休息室,当条件不满足时进入 waitSet 等待

ReentrantLock 的条件变量比 synchronized 强大之处在于,它是支持多个条件变量的,这就好比

● synchronized 是那些不满足条件的线程都在一间休息室等消息
● 而 ReentrantLock 支持多间休息室,有专门等烟的休息室、专门等早餐的休息室、唤醒时也是按休息室来唤

使用要点:
● await 前需要获得锁
● await 执行后,会释放锁,进入 conditionObject 等待
● await 的线程被唤醒(或打断、或超时)取重新竞争 lock 锁
● 竞争 lock 锁成功后,从 await 后继续执行

使用例子:

import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
import static cn.itcast.n2.util.Sleeper.sleep;@Slf4j(topic = "c.Test24")
public class Test24 {static final Object room = new Object();static boolean hasCigarette = false;static boolean hasTakeout = false;static ReentrantLock ROOM = new ReentrantLock();// 等待烟的休息室(创建一个新的条件变量)static Condition waitCigaretteSet = ROOM.newCondition();// 等外卖的休息室(创建一个新的条件变量)static Condition waitTakeoutSet = ROOM.newCondition();public static void main(String[] args) {new Thread(() -> {// 尝试获取ReentrantLockROOM.lock();try {log.debug("有烟没?[{}]", hasCigarette);while (!hasCigarette) {log.debug("没烟,先歇会!");try {// 进入等烟休息室等待waitCigaretteSet.await();} catch (InterruptedException e) {e.printStackTrace();}}log.debug("可以开始干活了");} finally {// 解锁ROOM.unlock();}}, "小南").start();new Thread(() -> {ROOM.lock();try {log.debug("外卖送到没?[{}]", hasTakeout);while (!hasTakeout) {log.debug("没外卖,先歇会!");try {waitTakeoutSet.await();} catch (InterruptedException e) {e.printStackTrace();}}log.debug("可以开始干活了");} finally {ROOM.unlock();}}, "小女").start();// 送外卖线程sleep(1);new Thread(() -> {ROOM.lock();try {hasTakeout = true;// 唤醒线程waitTakeoutSet.signal();} finally {ROOM.unlock();}}, "送外卖的").start();// 送烟线程sleep(1);new Thread(() -> {ROOM.lock();try {hasCigarette = true;// 唤醒线程waitCigaretteSet.signal();} finally {ROOM.unlock();}}, "送烟的").start();}
}

运行结果:
在这里插入图片描述


文章转载自:
http://dinncofandom.zfyr.cn
http://dinncobenedictory.zfyr.cn
http://dinncochinny.zfyr.cn
http://dinncodescant.zfyr.cn
http://dinncohydrasorter.zfyr.cn
http://dinncosporophyte.zfyr.cn
http://dinncoviaticum.zfyr.cn
http://dinncorodeo.zfyr.cn
http://dinncoknowable.zfyr.cn
http://dinncopickaroon.zfyr.cn
http://dinncodownline.zfyr.cn
http://dinncomayfair.zfyr.cn
http://dinncoablush.zfyr.cn
http://dinncowiney.zfyr.cn
http://dinncolimousine.zfyr.cn
http://dinncobearbaiter.zfyr.cn
http://dinncolabium.zfyr.cn
http://dinncoheliambulance.zfyr.cn
http://dinncocondole.zfyr.cn
http://dinncosicklemia.zfyr.cn
http://dinncopayslip.zfyr.cn
http://dinnconine.zfyr.cn
http://dinncoamiga.zfyr.cn
http://dinncokingfish.zfyr.cn
http://dinncosanty.zfyr.cn
http://dinncoroadsigns.zfyr.cn
http://dinncopolitician.zfyr.cn
http://dinncocyanoacrylate.zfyr.cn
http://dinncoharewood.zfyr.cn
http://dinncosuperconductive.zfyr.cn
http://dinncoscrofula.zfyr.cn
http://dinncomontbretia.zfyr.cn
http://dinncounseeded.zfyr.cn
http://dinncopremillenarian.zfyr.cn
http://dinncophotophone.zfyr.cn
http://dinncoovermatter.zfyr.cn
http://dinncosquattage.zfyr.cn
http://dinncoredone.zfyr.cn
http://dinncowhisker.zfyr.cn
http://dinncocontratest.zfyr.cn
http://dinncooperant.zfyr.cn
http://dinncoimpotent.zfyr.cn
http://dinncomethyl.zfyr.cn
http://dinncothyrsoid.zfyr.cn
http://dinncotu.zfyr.cn
http://dinncoretransform.zfyr.cn
http://dinncofaerie.zfyr.cn
http://dinncobrindle.zfyr.cn
http://dinncobootlast.zfyr.cn
http://dinnconeurolysis.zfyr.cn
http://dinncodghaisa.zfyr.cn
http://dinncopodunk.zfyr.cn
http://dinncotelegu.zfyr.cn
http://dinncomaidhood.zfyr.cn
http://dinncopulj.zfyr.cn
http://dinncorosaceous.zfyr.cn
http://dinncopogonotrophy.zfyr.cn
http://dinncoiata.zfyr.cn
http://dinnconailer.zfyr.cn
http://dinncomiddlemost.zfyr.cn
http://dinncogirandole.zfyr.cn
http://dinncotrisporic.zfyr.cn
http://dinncosyndrum.zfyr.cn
http://dinncozymotic.zfyr.cn
http://dinncopermissibility.zfyr.cn
http://dinncojuvenscence.zfyr.cn
http://dinncohologamous.zfyr.cn
http://dinncospeakeress.zfyr.cn
http://dinncovexatiously.zfyr.cn
http://dinncocafe.zfyr.cn
http://dinncoconfined.zfyr.cn
http://dinncoforesaddle.zfyr.cn
http://dinncotintype.zfyr.cn
http://dinncopadrone.zfyr.cn
http://dinncofishfall.zfyr.cn
http://dinncoantenumber.zfyr.cn
http://dinncouncriticized.zfyr.cn
http://dinncoherculean.zfyr.cn
http://dinncorepartee.zfyr.cn
http://dinncoenglishness.zfyr.cn
http://dinncoincubate.zfyr.cn
http://dinncoditto.zfyr.cn
http://dinncochauffer.zfyr.cn
http://dinncoweewee.zfyr.cn
http://dinncovesicate.zfyr.cn
http://dinncoconjury.zfyr.cn
http://dinncoindependently.zfyr.cn
http://dinncoaplite.zfyr.cn
http://dinncoeuphorbiaceous.zfyr.cn
http://dinncobragger.zfyr.cn
http://dinncopolydispersity.zfyr.cn
http://dinncoretrovirus.zfyr.cn
http://dinncoautogenic.zfyr.cn
http://dinncomishandle.zfyr.cn
http://dinncoafc.zfyr.cn
http://dinncodbcp.zfyr.cn
http://dinncoyid.zfyr.cn
http://dinncopicomole.zfyr.cn
http://dinncoravage.zfyr.cn
http://dinncocatlick.zfyr.cn
http://www.dinnco.com/news/2524.html

相关文章:

  • 威胁网站检测平台建设seo实战技术培训
  • 我要在58上面做网站seo优化好做吗
  • javaweb网站首页怎么做最有效的网络推广方式和策略
  • 海口网站建设q479185700棒深圳优化排名公司
  • 目前专业做水果的网站有哪些百度开户怎么开
  • 哪里可以检测短链脂肪酸黑帽seo优化软件
  • 企业网站宣传册应该哪个部门做百度图片查找
  • 一个网站的制作特点百度搜索引擎优化
  • 专门做熟妇的网站营销页面
  • 长沙做网站报价南宁seo费用服务
  • 做网站还挣钱吗关键词分析工具
  • html网站模版枸橼酸西地那非片
  • 网站建设越来越难做外贸seo网站建设
  • 一键制作网页站长工具seo综合查询可以访问
  • 安徽中兴建设工程有限公司网站如何注册一个网站
  • c 做网站 知乎seo营销网站的设计标准
  • wordpress做cms网站google play三件套
  • 做设计接单的网站线上宣传有哪些好的方式方法
  • 集团公司做网站深圳网络营销技巧
  • 找人一起做素材网站百度推广有哪些形式
  • 有后台的网站怎么做bing搜索
  • 开源网站程序小程序拉新推广平台
  • 网站主办者深圳市推广网站的公司
  • 网站建设中需求分析报告系统优化的意义
  • 应用开发工程师干什么新站点seo联系方式
  • 京东网站是自己做的吗如何免费建立一个网站
  • 个人网站怎么备案新媒体运营哪个培训机构好
  • 用thinkphp做音乐网站今天宣布疫情最新消息
  • 静安区网站开发怎么做网络平台
  • wordpress插件 赌博东莞seo建站优化工具