自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ConstXiong

记录编程实践...

  • 博客(21)
  • 资源 (7)
  • 收藏
  • 关注

原创 Java 中有哪些无锁技术来解决并发问题?如何使用?

除了使用 synchronized、Lock 加锁之外,Java 中还有很多不需要加锁就可以解决并发问题的工具类1、原子工具类JDK 1.8 中,java.util.concurrent.atomic 包下类都是原子类,原子类都是基于sun.misc.Unsafe 实现的。CPU 为了解决并发问题,提供了 CAS 指令,全称 Compare And Swap,即比较并交互 C...

2019-09-29 00:20:17 1446 6

原创 Java中的线程等待和唤醒

用死循环的方式,一直尝试获取锁。在任务耗时比较长或者并发冲突比较大的时候,就不适合。因为任务耗时比较长或者并发冲突比较大的时候,可能要循环上万次都不止,才能获取到锁,太消耗 CPU 。这种场景下,理想的解决方案:线程执行任务的条件不满足时,阻塞自己,进入等待状态;当线程执行的任务条件满足时,通知等待的线程继续执行。 线程阻塞的方式,能够避免循环等待对 CPU 的消耗。在...

2019-09-28 09:19:04 1145

原创 带着问题重学 Java 并发编程

基本概念什么是并发编程?为什么要用并发编程?并发编程的缺点?并行是什么意思?与并发的区别是什么?什么是线程?什么是进程?为什么要有线程?有什么关系与区别?如何创建、启动 Java 线程?如何优雅地停止一个线程?什么是守护线程?线程包括哪些状态?状态之间是如何变化的?什么是线程池?Executors如何创建线程池?线程池包含哪些状态?如何停止一个线...

2019-09-26 09:42:26 1178

原创 什么是活锁和饥饿?及示例

活锁任务没有被阻塞,由于某些条件没有满足,导致一直重复尝试—失败—尝试—失败的过程。 处于活锁的实体是在不断的改变状态,活锁有可能自行解开。死锁是大家都拿不到资源都占用着对方的资源,而活锁是拿到资源却又相互释放不执行。解决活锁的一个简单办法就是在下一次尝试获取资源之前,随机休眠一小段时间。看一下,我们之前的一个例子,如果最后不进行随机休眠,就会产生活锁,现象就是很长一段...

2019-09-26 09:28:05 2238

原创 如何避免死锁

并发程序一旦死锁,往往我们只能重启应用。解决死锁问题最好的办法就是避免死锁。死锁发生的条件互斥,共享资源只能被一个线程占用 占有且等待,线程 t1 已经取得共享资源 s1,尝试获取共享资源 s2 的时候,不释放共享资源 s1 不可抢占,其他线程不能强行抢占线程 t1 占有的资源 s1 循环等待,线程 t1 等待线程 t2 占有的资源,线程 t2 等待线程 t1 占有的资源...

2019-09-24 20:27:54 1114

原创 Java 中锁之间的对比

synchronized 和 java.util.concurrent.lock.Lock 之间的区别实现层面不一样。synchronized 是 Java 关键字,JVM层面 实现加锁和释放锁;Lock 是一个接口,在代码层面实现加锁和释放锁 是否自动释放锁。synchronized 在线程代码执行完或出现异常时自动释放锁;Lock 不会自动释放锁,需要在finally {} 代码块显...

2019-09-21 22:44:24 585

原创 Java 中可重入锁、不可重入锁的测试

可重入锁指在同一个线程在外层方法获取锁的时候,进入内层方法会自动获取锁。为了避免死锁的发生,JDK 中基本都是可重入锁。下面我们来测试一下 synchronized 和java.util.concurrent.lock.ReentrantLock 锁的可重入性测试 synchronized 加锁 可重入性package constxiong.concurrency.a...

2019-09-20 18:32:32 741

原创 Java 中的锁如何使用?有什么注意事项?

Java 中常见的锁有synchronized 可重入锁 java.util.concurrent.lock.ReentrantLock 可重复读写锁 java.util.concurrent.lock.ReentrantReadWriteLocksynchronized 有 3种用法修饰普通方法,执行方法代码,需要获取对象本身 this 的锁package constxi...

2019-09-19 20:47:07 1015

原创 Java 中的锁

今天是九一八事变爆发 88 周年,国耻日。每当我看到祖国的航空航天、互联网、5G 这些科技方面赶超美国的新闻时,我内心都异常激动,从 "东亚病夫" 到吾辈自强,靠得是无数中华儿女的实干。铭记历史...工作再忙,还是希望坚持把编程知识分享下去,继续 Java 并发编程。在并发编程中,经常会遇到多个线程访问同一个共享变量,当同时对共享变量进行读写操作时,就会产生数据不一致的情况。...

2019-09-18 22:23:33 647

原创 Java 中的 volatile 关键字

Java 中volatile 关键字是一个类型修饰符。JDK 1.5 之后,对其语义进行了增强。保证了不同线程对共享变量进行操作时的可见性,即一个线程修改了共享变量的值,共享变量修改后的值对其他线程立即可见 通过禁止编译器、CPU 指令重排序和部分 happens-before 规则,解决有序性问题volatile 可见性的实现在生成汇编代码指令时会在 volatile 修饰的...

2019-09-17 21:11:41 996

原创 Java 隐式锁 - synchronized 关键字

Java 中关键字synchronized表示只有一个线程可以获取作用对象的锁,执行代码,阻塞其他线程。作用:确保线程互斥地访问同步代码 保证共享变量的修改能够及时可见 有效解决重排序问题用法:修饰普通方法 修饰静态方法 指定对象,修饰代码块特点: 阻塞未获取到锁、竞争同一个对象锁的线程 获取锁无法设置超时 无法实现公平锁 控制等待和唤醒需要...

2019-09-15 21:47:15 960

原创 导致并发程序出问题的根本原因是什么?

CPU、内存、IO 设备的读写速度差异巨大,表现为 CPU 的速度 >内存的速度 > IO 设备的速度。程序的性能瓶颈在于速度最慢的 IO 设备的读写,也就是说当涉及到 IO 设备的读写,再怎么提升 CPU 和内存的速度也是起不到提升性能的作用。为了更好地利用 CPU 的高性能计算机体系结构,给 CPU 增加了缓存,均衡 CPU 和内存的速度差异 操作系统,...

2019-09-14 22:44:01 2314 1

原创 如何停止一个线程池?

Java 并发工具包中java.util.concurrent.ExecutorService 接口定义了线程池任务提交、获取线程池状态、线程池停止的方法等。JDK 1.8 中,线程池的停止一般使用shutdown()、shutdownNow()、shutdown() + awaitTermination(long timeout, TimeUnit unit) 方法。1、...

2019-09-13 18:26:37 2981

原创 博客网站显示框相对浏览器固定位置显示

个人博客网站的菜单渐渐多了起来,文章也在陆续维护了。当文章内容比较长的时候,往下滑动,文章右侧就没有内容了。希望当浏览文章超过二维码显示框之后,把右侧文章分类显示框相对浏览器固定位置显示。页面回到文章顶部时,原样显示。需求想好了,就来实现一下。1、处理只对pc端有效//是否为移动端function is_mobile() { var...

2019-09-11 22:10:12 804

原创 线程池包含哪些状态?

线程池状态:线程池的5种状态:RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED。见 ThreadPoolExecutor 源码// runState is stored in the high-order bits private static final int RUNNING = -1 << COUNT_BITS; ...

2019-09-10 23:24:44 2830 1

原创 Executors如何创建线程池?

Executors如何创建线程池?Executors 类是从 JDK 1.5 开始就新增的线程池创建的静态工厂类,它就是创建线程池的,但是很多的大厂已经不建议使用该类去创建线程池。原因在于,该类创建的很多线程池的内部使用了无界任务队列,在并发量很大的情况下会导致 JVM 抛出 OutOfMemoryError,直接让 JVM 崩溃,影响严重。但是 Executors 类究竟是如何使用...

2019-09-09 09:38:37 1411

原创 什么是线程池?

什么是线程池?线程池就是创建若干个可执行的线程放入一个池(容器)中,有任务需要处理时,会提交到线程池中的任务队列,处理完之后线程并不会被销毁,而是仍然在线程池中等待下一个任务。为什么要使用线程池?因为 Java 中创建一个线程,需要调用操作系统内核的 API,操作系统要为线程分配一系列的资源,成本很高,所以线程是一个重量级的对象,应该避免频繁创建和销毁。使用线程池就能很好地避免...

2019-09-07 20:12:44 1590

原创 线程包括哪些状态?状态之间是如何转变的?

线程的生命周期线程包括哪些状态的问题说专业一点就是线程的生命周期。不同的编程语言对线程的生命周期封装是不同的。Java 中线程的生命周期Java 语言中线程共有六种状态。NEW(初始化状态) RUNNABLE(可运行 / 运行状态) BLOCKED(阻塞状态) WAITING(无限时等待) TIMED_WAITING(有限时等待) TERMINATED(终止状态)...

2019-09-04 23:25:12 3092 1

原创 什么是守护线程?

Java线程分为用户线程和守护线程。守护线程是程序运行的时候在后台提供一种通用服务的线程。所有用户线程停止,进程会停掉所有守护线程,退出程序。Java中把线程设置为守护线程的方法:在 start 线程之前调用线程的 setDaemon(true) 方法。注意:setDaemon(true) 必须在 start() 之前设置,否则会抛出IllegalThreadStateExc...

2019-09-03 12:31:57 8364 2

原创 如何优雅地停止一个线程?

线程终止有两种情况:1、线程的任务执行完成2、线程在执行任务过程中发生异常这两者属于线程自行终止,如何让线程 A 把线程 B 终止呢?Java 中 Thread 类有一个 stop() 方法,可以终止线程,不过这个方法会让线程直接终止,在执行的任务立即终止,未执行的任务无法反馈,所以 stop() 方法已经不建议使用。既然 stop() 方法如此粗暴,不建议使用,我...

2019-09-03 09:11:57 3856

原创 如何创建、启动 Java 线程?

Java 中有 4 种常见的创建线程的方式。一、重写 Thread 类的 run() 方法。 表现形式有两种:1)new Thread 对象匿名重写 run() 方法package constxiong.concurrency.a006; /** * new Thread 对象匿名重写 run() 方法,启动线程 * @author ConstXiong */...

2019-09-02 10:19:18 1762

eclipse使用教程ppt

ppt版,eclipse的使用教程。简单介绍了eclipse的使用。

2018-09-03

Eclipse入门教程

eclipse的入门教程,介绍了如何使用eclipse开发java项目。

2018-08-31

JasperReport中文用户手册

JasperReport是一款开源报表引擎,用纯java编写。文档是对JasperReport的介绍。包含设计工具和模板文件等...

2018-08-30

无线wifi破解教程

简单介绍了wifi的工作原理。讲解了如何使用破解工具,搭建工作环境。使用字典破解wifi的密码。

2018-08-30

空空如也

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

TA关注的人

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