首页
友链
关于
留言板
推荐
电脑壁纸
在线音乐
解压游戏
Search
1
【菜谱】咖喱鸡肉盖饭
3,704 阅读
2
pycharm生成requirements.txt
1,103 阅读
3
ubuntu安装docker和docker-compose
1,018 阅读
4
celery worker启动报错:AttributeError: 'str' object has no attribute 'items'
739 阅读
5
django后台管理界面美化
638 阅读
学习
python
linux
java
菜谱
随笔
登录
Search
标签搜索
笔记
linux
python
java
实用教程
原创
编程
多线程
docker
tomcat
thread
锁
线程同步
ssm
maven
Markdown
Windows
菜谱
生活笔记
django
Dawn
累计撰写
39
篇文章
累计收到
8
条评论
首页
栏目
学习
python
linux
java
菜谱
随笔
页面
友链
关于
留言板
推荐
电脑壁纸
在线音乐
解压游戏
搜索到
2
篇与
线程同步
的结果
2021-07-27
java-Lock锁概述
1.Lock锁概述从JDK5.0开始,Java提供了更强大的线程同步机制--通过显式定义同步锁对象来实现同步。java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象。ReentrantLock(可重入锁)类实现了Lock,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,比较常用的时ReentrantLock,可以显式加锁、释放锁。Lock是一个接口,两个直接实现类:ReentrantLock(可重入锁),ReentrantReadWriteLock(读写锁)语法://定义锁 private final ReentrantLock lock = new ReentrantLock(); lock.lock();//加锁 try { //保证线程安全的代码 }finally { lock.unlock;//解锁 }示例: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锁 private final ReentrantLock lock = new ReentrantLock(); @Override public void run() { while (true) { lock.lock();//加锁 try{ if (ticketNums > 0){ try { Thread.sleep(1000); System.out.println(ticketNums--); } catch (InterruptedException e) { e.printStackTrace(); } }else{ break; } }finally { lock.unlock();//解锁 } } } }2. Lock锁的API修饰符和类型方法描述voidlock()获得锁voidlockInterruptibly()获得锁,可中断。举个例子,当两个线程同时通过lock.lockInterruptibly()想获取某个锁时,假若此时线程A获取到了锁,而线程B只有在等待,那么对线程B调用threadB.interrupt()方法能够中断线程B的等待过程。booleantryLock()锁在空闲的时候才能获取锁(未获得锁不会等待)。举个例子:当两个线程同时通过lock.terLock()想获取某个锁时,假若此时线程A获取到了锁,而线程B不会等待,直接放弃获取锁。booleantryLock(Long time, TimeUnit unit)如果锁定可用,则此方法立即返回true如果锁不可用,则当前线程将被禁用以进行线程调度,并且在发生以下三种情况之一之前处于休眠状态: 1.当前线程获取锁 2.其它一些线程中断当前线程 3.等待时间过去了,返回falsevoidunlock()释放锁3.synchronized与Lock的对比Lock是显式锁(手动开启和关闭锁,别忘记关闭锁)synchronized是隐式锁,出了作用域自动释放Lock只有代码块锁,synchronized有代码块锁和方法锁使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类)优先使用顺序:Lock > 同步代码块(已经进入了方法体,分配了资源) > 同步方法(在方法体之外)
2021年07月27日
123 阅读
0 评论
0 点赞
2021-07-27
java死锁简介
1.死锁的定义死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。即某一个同步块同时拥有“两个以上对象的锁”时,就可能会发生"死锁"的问题。示例:public class TestDeadLock { public static void main(String[] args) { MakeUp makeUp1 = new MakeUp(0, "小灰"); MakeUp makeUp2 = new MakeUp(1, "小白"); makeUp1.start(); makeUp2.start(); } } class Lipstick{ } class Mirror{ } class MakeUp extends Thread { //需要的资源只有一份 static Lipstick lipstick = new Lipstick(); static Mirror mirror = new Mirror(); int choice; //选择 String girlName; //使用化妆品的人 MakeUp(int choice, String girlName){ this.choice = choice; this.girlName = girlName; } @Override public void run() { //化妆 makeUp(); } private void makeUp(){ if (choice == 0){ synchronized (lipstick){//获得口红的锁 try { System.out.println(this.girlName + "获得口红的锁"); Thread.sleep(1000); synchronized (mirror){//1秒钟后获得镜子的锁 System.out.println(this.girlName + "获得镜子的锁"); } } catch (InterruptedException e) { e.printStackTrace(); } } // synchronized (mirror){//1秒钟后获得镜子的锁 // System.out.println(this.girlName + "获得镜子的锁"); // } }else{ synchronized (mirror){//获得镜子的锁 try { System.out.println(this.girlName + "获得镜子的锁"); Thread.sleep(2000); synchronized (lipstick){//1秒钟后获得口红的锁 System.out.println(this.girlName + "获得口红的锁"); } } catch (InterruptedException e) { e.printStackTrace(); } } // synchronized (lipstick){//1秒钟后获得口红的锁 // System.out.println(this.girlName + "获得口红的锁"); // } } } }2.产生死锁的四个必要条件互斥条件:一个资源每次只能被一个进程使用。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。上面列出了死锁的四个必要条件,我们只要想办法破其中任意一个或多个条件就可以避免死锁发生。
2021年07月27日
67 阅读
0 评论
0 点赞