请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

并发编程之第四篇

[复制链接]
查看: 62|回复: 0

3万

主题

3万

帖子

9万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
92750
发表于 2020-2-15 11:29 | 显示全部楼层 |阅读模式
并发编程之第四篇


4.11 多把锁

一间大屋子有两个功用 : 睡觉、进修、互不相关
现在小南要进修,小女要睡觉,但假如只用一间屋子(一个工具锁)的话,那末并发度很低
治理方式时预备多个房间(多个工具锁)
我的关键词 并发编程之第四篇  热门消息 20200210151325996

4.12 活跃性

死锁
有这样的情况 : 一个线程需要同时获得多把锁,这时就轻易发生死锁
t1 线程获得A工具锁,接下来想获得B工具的锁
t2 线程获得B工具锁,接下来想获得A工具的锁
我的关键词 并发编程之第四篇  热门消息 20200210153538533

定位死锁

  • 检测死锁可以利用jconsole工具,大要利用jps定位进程id,再用jstack定位死锁 :
    我的关键词 并发编程之第四篇  热门消息 20200210153944855

    我的关键词 并发编程之第四篇  热门消息 20200210153949399

饥饿

先来看看一个线程饥饿的例子,利用次第加锁的方式治理之前的死锁题目
我的关键词 并发编程之第四篇  热门消息 20200210202955140

次第加锁的治理计划
我的关键词 并发编程之第四篇  热门消息 20200210203219376

4.13 ReentrantLock

相对于synchronized它具有以下特点

  • 可制止
  • 可设备超不时候
  • 可以设备为公允锁
  • 支持多个条件变量
    与synch一样,都支持可重入
    可重入
    可重入是指用一个线程假如初度获得了这把锁,那末由于它是这把锁的具有者,是以有权利再次获得这把锁
    假如是不成重入锁,那末第二次获得锁时,自己也会被锁盖住
    底子语法
    我的关键词 并发编程之第四篇  热门消息 20200210205552828

同步形式之次第控制

牢固运转次第
比如,必须先2后1打印
wait notify版
我的关键词 并发编程之第四篇  热门消息 20200211074617446

我的关键词 并发编程之第四篇  热门消息 20200211074926430

交替输出

线程1输出a5次,线程2输出b5次,线程3输出c5次。现在要去输出abcabcabcabcabc怎样实现
  1. package com.example.demo;import lombok.extern.slf4j.Slf4j;@Slf4jpublic class Test27 {    public static void main(String[] args) {        WaitNotify waitNotify = new WaitNotify(1, 5);        new Thread(() -> {            waitNotify.print("a", 1, 2);        }).start();        new Thread(() -> {            waitNotify.print("b", 2, 3);        }).start();        new Thread(() -> {            waitNotify.print("c", 3, 1);        }).start();    }}/** * 输出内容         等待标志        下一个标志 * a                1               2 * b                2               3 * c                3               1 */class WaitNotify {    /**     * 打印     * @param str     * @param waitFlag     * @param nextFLag     */    public void print(String str, int waitFlag, int nextFLag) {        for (int i = 0; i < loopNumber; i++) {            synchronized (this) {                while (flag != waitFlag) {                    try {                        this.wait();                    } catch (Exception e) {                        e.printStackTrace();                    }                }                System.out.println(str);                flag = nextFLag;                this.notifyAll();            }        }    }    /**     * 等待标志     */    private int flag;    /**     * 循环次数     */    private int loopNumber;    public WaitNotify(int flag, int loopNumber) {        this.flag = flag;        this.loopNumber = loopNumber;    }}package com.example.demo;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class Test2 {    public static void main(String[] args) throws InterruptedException {        AwaitSignal awaitSignal = new AwaitSignal(5);        Condition a = awaitSignal.newCondition();        Condition b = awaitSignal.newCondition();        Condition c = awaitSignal.newCondition();        new Thread(() -> {            awaitSignal.print("a", a, b);        }).start();        new Thread(() -> {            awaitSignal.print("b", b, c);        }).start();        new Thread(() -> {            awaitSignal.print("c", c, a);        }).start();        Thread.sleep(1000);        awaitSignal.lock();        try {            System.out.println("起头。。。。");            a.signal();        } finally {            awaitSignal.unlock();        }    }}class AwaitSignal extends ReentrantLock {    private int loopNumber;    public AwaitSignal(int loopNumber) {        this.loopNumber = loopNumber;    }    /**     * 参数1 打印内容,参数2 进入那一间休息室,参数3 下一间休息室     * @param str     * @param current     * @param next     */    public void print(String str, Condition current, Condition next) {        for (int i = 0; i < loopNumber; i++) {            lock();            try {                current.await();                System.out.println(str);                next.signal();            } catch (InterruptedException e) {                e.printStackTrace();            } finally {                unlock();            }        }    }}
复制代码
免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 WAYSFOCUS 影像 你 我 他,中国商业影视一站式解决平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表