自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

徘徊在牛A与牛C之间的码农

[为梦想,不负韶华] 不要假装去努力,结果不会陪着你演戏

  • 博客(15)
  • 资源 (5)
  • 收藏
  • 关注

转载 Java多线程学习十三:synchronized 和 Lock 区别以及孰优孰劣,如何选择?

synchronized 和 Lock 的异同点,以及该如何选择。相同点synchronized 和 Lock 的相同点非常多,我们这里重点讲解 3 个比较大的相同点 ABC。A:synchronized 和 Lock 都是用来保护资源线程安全的。这一点毋庸置疑,这是它们的基本作用。B:都可以保证可见性。对于 synchronized 而言,线程 A 在进入 synchronized 块之前或在 synchronized 块内进行操作,对于后续的获得同一个 monitor 锁.

2021-02-28 21:44:14 360

转载 Java多线程学习十二: synchronized的工作原理 以及背后的“monitor 锁”

我们研究下 synchronized 背后的 monitor 锁。获取和释放 monitor 锁的时机我们都知道,最简单的同步方式就是利用 synchronized 关键字来修饰代码块或者修饰一个方法,那么这部分被保护的代码,在同一时刻就最多只有一个线程可以运行,而 synchronized 的背后正是利用 monitor 锁实现的。所以首先我们来看下获取和释放 monitor 锁的时机,每个 Java 对象都可以用作一个实现同步的锁,这个锁也被称为内置锁或 monitor 锁,获得 mon.

2021-02-28 21:23:39 182

转载 Java多线程学习十二:悲观锁和乐观锁的本质||

悲观锁和乐观锁是从是否锁住资源的角度进行分类的。悲观锁悲观锁比较悲观,它认为如果不锁住这个资源,别的线程就会来争抢,就会造成数据结果错误,所以悲观锁为了确保结果的正确性,会在每次获取并修改数据时,都把数据锁住,让其他线程无法访问该数据,这样就可以确保数据内容万无一失。这也和我们人类中悲观主义者的性格是一样的,悲观主义者做事情之前总是担惊受怕,所以会严防死守,保证别人不能来碰我的东西,这就是悲观锁名字的含义。乐观锁乐观锁比较乐观,认为自己在操作资源的时候不会有其..

2021-02-28 21:01:09 110

转载 Java多线程学习十一:你知道哪几种锁?各有什么特点

锁的 7 大分类需要首先指出的是,这些多种多样的分类,是评价一个事物的多种标准,比如评价一个城市,标准有人口多少、经济发达与否、城市面积大小等。而一个城市可能同时占据多个标准,以北京而言,人口多,经济发达,同时城市面积还很大。同理,对于 Java 中的锁而言,一把锁也有可能同时占有多个标准,符合多种分类,比如 ReentrantLock 既是可中断锁,又是可重入锁。根据分类标准我们把锁分为以下 7 大类别,分别是:偏向锁/轻量级锁/重量级锁;可重入锁/非可重入锁;共...

2021-02-28 13:20:10 216

转载 Java多线程学习十:线程池实现“线程复用”的原理

线程复用原理我们知道线程池会使用固定数量或可变数量的线程来执行任务,但无论是固定数量或可变数量的线程,其线程数量都远远小于任务数量,面对这种情况线程池可以通过线程复用让同一个线程去执行不同的任务,那么线程复用背后的原理是什么呢?线程池可以把线程和任务进行解耦,线程归线程,任务归任务,摆脱了之前通过 Thread 创建线程时的一个线程必须对应一个任务的限制。在线程池中,同一个线程可以从 BlockingQueue 中不断提取新任务来执行,其核心原理在于线程池对 Thread 进行了封装,并不是每次执

2021-02-26 21:06:04 464

转载 Java多线程学习九:如何正确关闭线程池?shutdown 和 shutdownNow 的区别

如何正确关闭线程池?以及 shutdown() 与 shutdownNow() 方法的区别?首先,我们创建一个线程数固定为 10 的线程池,并且往线程池中提交 100 个任务,如代码所示。复制代码ExecutorServiceservice=Executors.newFixedThreadPool(10);for(inti=0;i<100;i++){service.execute(newTask());}那么如果现在我们想关闭该线程池该如何做呢?本...

2021-02-25 20:24:48 349

转载 Java多线程学习九:怎样确定线程数量及CPU 核心数和线程数的关系||如何定制自己的线程池

调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能。在实际工作中,我们需要根据任务类型的不同选择对应的策略。CPU 密集型任务首先,我们来看 CPU 密集型任务,比如加密、解密、压缩、计算等一系列需要大量耗费 CPU 资源的任务。对于这样的任务最佳的线程数为 CPU 核心数的 1~2 倍,如果设置过多的线程数,实际上并不会起到很好的效果。此时假设我们设置的线程数量是 CPU 核心数的 2 倍以上,因为计算任务非常重,会占用大量的 CPU 资源,

2021-02-25 20:15:21 2736

转载 Java多线程学习八:线程池常用的阻塞队列

线程池内部结构线程池的内部结构主要由四部分组成,如图所示。第一部分是线程池管理器,它主要负责管理线程池的创建、销毁、添加任务等管理操作,它是整个线程池的管家。第二部分是工作线程,也就是图中的线程 t0~t9,这些线程勤勤恳恳地从任务队列中获取任务并执行。第三部分是任务队列,作为一种缓冲机制,线程池会把当下没有处理的任务放入任务队列中,由于多线程同时从任务队列中获取任务是并发场景,此时就需要任务队列满足线程安全的要求,所以线程池中任务队列采用 BlockingQueue 来保障线程安全。

2021-02-25 19:57:35 783

转载 Java多线程学习七:线程池的 4 种拒绝策略和 6 种常见的线程池

以便在必要的时候按照我们的策略来拒绝任务,那么拒绝任务的时机是什么呢?线程池会在以下两种情况下会拒绝新提交的任务。第一种情况是当我们调用 shutdown 等方法关闭线程池后,即便此时可能线程池内部依然有没执行完的任务正在执行,但是由于线程池已经关闭,此时如果再向线程池内提交任务,就会遭到拒绝。第二种情况是线程池没有能力继续处理新提交的任务,也就是工作已经非常饱和的时候。我们具体讲一下第二种情况,也就是由于工作饱和导致的拒绝。比如新建一个线程池,使用容量上限为 10 的 ArrayBlockingQ

2021-02-24 20:40:09 1005

转载 Java多线程学习六:使用线程池比手动创建线程好在那里以及常用线程池参数的意义

为什么要使用线程池首先,回顾线程池的相关知识,在 Java 诞生之初是没有线程池的概念的,而是先有线程,随着线程数的不断增加,人们发现需要一个专门的类来管理它们,于是才诞生了线程池。没有线程池的时候,每发布一个任务就需要创建一个新的线程,这样在任务少时是没有问题的,如代码所示。/***描述:单个任务的时候,新建线程来执行*/publicclassOneTask{publicstaticvoidmain(String[]args){...

2021-02-23 22:05:51 237

转载 Java多线程学习五:哪些场景需要额外注意线程安全问题及多线程也可能引起性能问题

访问共享变量或资源第一种场景是访问共享变量或共享资源的时候,典型的场景有访问共享对象的属性,访问 static 静态变量,访问共享的缓存,等等。因为这些信息不仅会被一个线程访问到,还有可能被多个线程同时访问,那么就有可能在并发读写的情况下发生线程安全问题。比如多线程同时 i++ 的例子:/***描述:共享的变量或资源带来的线程安全问题*/publicclassThreadNotSafe1{staticinti;publicstati...

2021-02-22 21:03:18 415

转载 Java多线程学习四:共有哪 3 类线程安全问题

我们在实际开发中经常会遇到线程不安全的情况,那么一共有哪 3 种典型的线程安全问题呢? 运行结果错误; 发布和初始化导致线程安全问题; 活跃性问题。 运行结果错误来看多线程同时操作一个变量导致的运行结果错误。publicclassWrongResult{volatilestaticinti;publicstaticvoidmain(String[]args)throwsInterruptedException{...

2021-02-21 21:41:55 125

转载 Java多线程学习三:有哪几种实现生产者消费者模式的方法

我们先来看看什么是生产者消费者模式,生产者消费者模式是程序设计中非常常见的一种设计模式,被广泛运用在解耦、消息队列等场景。在现实世界中,我们把生产商品的一方称为生产者,把消费商品的一方称为消费者,有时生产者的生产速度特别快,但消费者的消费速度跟不上,俗称“产能过剩”,又或是多个生产者对应多个消费者时,大家可能会手忙脚乱。如何才能让大家更好地配合呢?这时在生产者和消费者之间就需要一个中介来进行调度,于是便诞生了生产者消费者模式。使用生产者消费者模式通常需要在两者之间增加一个阻塞队列作为媒介,有了媒介之后就

2021-02-21 15:55:20 243

转载 Java多线程学习 二 wait/notify/notifyAll 方法的使用注意事项

为什么 wait方法必须在 synchronized保护的同步代码中使用?为什么 wait/notify/notifyAll 被定义在 Object 类中,而 sleep 定义在 Thread 类中?wait/notify 和 sleep 方法的异同?为什么 wait 必须在 synchronized保护的同步代码中使用?首先,我们来看第一个问题,为什么 wait方法必须在 synchronized保护的同步代码中使用?我们先来看看 wait 方法的源码注释是怎么写的。“wait ...

2021-02-21 14:28:18 162

转载 Java多线程基础学习一:线程的6种状态和相互转化

2021-02-21 13:45:21 93

log4j.properties(带配置说明)

Java log4j日志技术,标准配置文件,下载后只需放到项目的,src/main/resource文件下

2020-06-27

log4j.properties

java日志技术,标准 log4j的配置文件,名字必须为log4j.properties,且在 放在src/main/resources根目录下

2020-06-26

PLSQL_developer教程

对初学者很有用,文档中,有对pl/sql 操作的介绍,功能,设置相关的介绍....

2013-01-20

apache 帮助手册

apache 帮助 手册 KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

2011-06-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除