12 2020 档案

摘要:一.使用信号量实现线程同步 信号量是Dijkstra在1968年发明,它最初是用来在进程间发信号的一个整数值,一个信号量有且仅有3种操作,且它们全部都是原子操作:初始化,增加和减少。 它的增加可以为一个进程解除阻塞,减少可以让一个进程进入阻塞。 Java为线程提供了信号量支持,本实例将通过向银行存款 阅读全文
posted @ 2020-12-22 18:21 文牧之 阅读(10) 评论(0) 推荐(0) 编辑
摘要:一.哲学家就餐问题 为了快速进入状态我们先来复习下哲学家问题: 有5个哲学家去吃中餐,坐在一张圆桌上,他们旁边有五只筷子(每两个人中间放一根),哲学家们时而思考,时而吃饭,但每个人都需要一双筷子才能吃饭,并且在吃完后将筷子放回原处接着思考。 这里就有一个问题:我们都知道这五个哲学家不可能同时吃饭,如 阅读全文
posted @ 2020-12-22 12:17 文牧之 阅读(25) 评论(0) 推荐(0) 编辑
摘要:一.使用线程池的优势 Java中的对象是使用new操作符创建的,如果用new创建大量短生命周期的对象,这种方式性能非常低下。所以为了解决这个问题一些先行者们发明了池技术。 例如对于数据库连接有连接池,一样的对于线程有线程池。 线程池可以极大的简便我们的多线程编程,在需要大量线程的程序编程时,它不仅从 阅读全文
posted @ 2020-12-21 15:14 文牧之 阅读(5) 评论(0) 推荐(0) 编辑
摘要:一.使用阻塞队列实现线程同步 实际开发中使用java.util.concurrent包将有助于简化开发。 本Demo使用其中的LinkedBlockingQueue类来解决生产者消费者问题。 首先我们先了解下这个API:LinkedBlockingQueue< E >是一个基于已连接节点的,范围任意 阅读全文
posted @ 2020-12-21 14:07 文牧之 阅读(13) 评论(0) 推荐(0) 编辑
摘要:一.线程的同步 我们使用多线程编程的一个重要原因在于方便数据的共享。 但是共享就意味着存在安全性问题:如果两个线程同时修改一个数据,该听谁的?这就引发了同步问题。 1.下面我们用一个银行存入的例子来演示多线程编程的非同步的场景: 下面一个银行实例类: public class Bank { priv 阅读全文
posted @ 2020-12-20 12:37 文牧之 阅读(25) 评论(0) 推荐(0) 编辑
摘要:一.使用守护线程 在学习本demo之前我们先复习下守护线程的知识:Java中的线程可以分为两类,用户线程和守护线程。 其中用户线程是为了完成任务而存在的,而守护线程是为其他线程服务的,也就是说守护线程存在的意义就是守护其他的非守护线程,只有当所有非守护线程都执行完毕时,守护线程才可以结束。 下面的例 阅读全文
posted @ 2020-12-19 14:08 文牧之 阅读(7) 评论(0) 推荐(0) 编辑
摘要:一.查看和修改线程名称 首先先粗略的看一下下面的代码:可以试着运行一下,看一下效果 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Font; i 阅读全文
posted @ 2020-12-19 13:00 文牧之 阅读(19) 评论(0) 推荐(0) 编辑
摘要:1.计算机网络的性能 我们所说的计算机网络的性能一般指的是它的七个重要的性能指标: 1) 速率:就是数据传输的速率,单位bit 2) 带宽:在计算机网络中,带宽用来表示某通道传输数据的能力,网络带宽表示在单位时间内网络中的某信道所能通过的“最高数据率”。 3) 吞吐量:它表示在单位时间内通过某个网络 阅读全文
posted @ 2020-12-17 15:35 文牧之 阅读(13) 评论(0) 推荐(0) 编辑
摘要:一.概述 在编写并发程序时,可以采用与编写串行程序时相同的设计原则与设计模式。 二者的差异在于,并发程序存在一定程度的不确定性,而串行程序中不存在这个问题。 所以在测试并发程序时,所面临的主要挑战在于:潜在错误的发生并不具有确定性,而是随机的。 要在测试中将这些故障暴露出来,就需要比普通的串行程序测 阅读全文
posted @ 2020-12-16 13:29 文牧之 阅读(11) 评论(0) 推荐(0) 编辑
摘要:1.检测CPU的利用率 当我们测试可伸缩性时,通常要确保处理器得到充分利用。 那我们如何检测CPU的利用率呢? 在windows下我们可以通过下面方式来检测,打开cmd: 回车。 2.在Linux下,我们可以: 如果所有的CPU的利用率并不均匀(有些CPU很忙碌,而有些很闲),那么我们的首要目标就是 阅读全文
posted @ 2020-12-14 15:38 文牧之 阅读(6) 评论(0) 推荐(0) 编辑
摘要:1.第一个多线程程序 public class Text { public static void main(String[] args) { DoThread(); } protected static void DoThread(){ final StringBuilder sb=new Str 阅读全文
posted @ 2020-12-13 21:04 文牧之 阅读(15) 评论(0) 推荐(0) 编辑
摘要:一.概述 线程的最主要的目的就是提高程序的运行性能。 本章将学习各种分析,监测以及提升并发程序性能的技术。但是我们在提升性能的同时要考虑到:程序的安全性才是第一位的。 我们要首先保证我们的程序在正确的前提下提升性能。 所以我们需要一些专业的知识去分析如何在不破坏程序的正确性的前提下提升性能。 这也是 阅读全文
posted @ 2020-12-13 13:21 文牧之 阅读(20) 评论(0) 推荐(0) 编辑
摘要:一.概述 ReentrantLock 实现了一种标准的互斥锁:每次最多只有一个线程能持有ReentrantLock。但对于维护数据的完整性来说,互斥通常是一种强硬的加锁规则,因此也就不必要的限制了并发性。 互斥是一种保守的加锁策略,虽然互斥可以避免 ”写/写“ 冲突和 “写/读” 冲突,但同样也避免 阅读全文
posted @ 2020-12-08 16:57 文牧之 阅读(19) 评论(0) 推荐(0) 编辑
摘要:一.概述 在Java 5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile,我们的选择不多。 但在Java5.0 增加了一种新的机制:ReentratLock ,显式锁。 它并不是一种替代内置加锁的方法,而是当内置加锁机制不适用时,作为一种可选择的高级功能 阅读全文
posted @ 2020-12-08 12:31 文牧之 阅读(8) 评论(0) 推荐(0) 编辑
摘要:一.概述 除了死锁之外,在并发程序中还存在一些其他的活跃性危险,包括:饥饿,活锁等等。 下面我们分别了解和学习下。 二.具体学习 1.饥饿 当线程由于无法访问它所需要的资源而不能继续执行时,就会发生 “饥饿(Starvation)” . 1)引发饥饿的最常见资源就是CPU时钟周期。如果在java应用 阅读全文
posted @ 2020-12-06 14:39 文牧之 阅读(8) 评论(0) 推荐(0) 编辑
摘要:一.概述 1.如果一个程序每次至多只能获得 一个锁(这显然不可能出现在实际编程中),那么就不会产生锁顺序死锁。 但是我们可以通过一些策略来避免锁顺序死锁。 2.如果必须获取多个锁,那么在设计时必须考虑锁的顺序:尽量减少潜在的加锁交互数量,将获取锁时需要遵循的协议写入正式文档并始终遵循这些协议。 3. 阅读全文
posted @ 2020-12-05 11:22 文牧之 阅读(17) 评论(0) 推荐(0) 编辑
摘要:一.避免活跃性危险 我们在设计并发程序时,在安全性和活跃性之间通常存在着某种制衡。 我们使用加锁机制来确保线程安全,但如果过度的使用加锁,则可能导致锁顺序死锁(Lock-Ordering Deadlock),同样我们使用线程池和信号量来限制对资源的使用,但这些被限制的行为可能会导致资源死锁(Reso 阅读全文
posted @ 2020-12-04 11:48 文牧之 阅读(8) 评论(0) 推荐(0) 编辑

more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示