很多刚接触多线程编程的开发者,虽然意识到了并发访问可变变量需要加锁,但是对于锁的范围、加锁的时机和锁的协同缺乏认识,往往会导致出现一些问题。下面笔者就结合Netty的代码来讲解下这方面的知识。

打开ForkJoinTask,我们学习一些多线程同步和协作方面的技巧。首先是当条件不满足时阻塞某个任务,直到条件满足后再继续执行,代码如图21-4所示。

重点看框线中的代码,首先通过循环检测的方式对状态变量status进行判断,当它的状态大于等于0时,执行wait(),阻塞当前的调度线程,直到status小于0,唤醒所有被阻塞的线程,继续执行。这个方法有以下三个多线程的编程技巧需要说明。

图21-4  多线程协作

(1)wait方法用来使线程等待某个条件,它必须在同步块内部被调用,这个同步块通常会锁定当前对象实例。下面是这个模式的标准使用方式。

synchronized(this)

{

While(condition)

Object.wait;

......

}

(2)始终使用wait循环来调用wait方法,永远不要在循环之外调用wait方法。这样做的原因是尽管并不满足被唤醒条件,但是由于其他线程调用notifyAll()方法会导致被阻塞线程意外唤醒,此时执行条件并不满足,它将破坏被锁保护的约定关系,导致约束失效,引起意想不到的结果。

(3)唤醒线程,应该使用notify还是notifyAll?当你不知道究竟该调用哪个方法时,保守的做法是调用notifyAll唤醒所有等待的线程。从优化的角度看,如果处于等待的所有线程都在等待同一个条件,而每次只有一个线程可以从这个条件中被唤醒,那么就应该选择调用notify。

当多个线程共享同一个变量的时候,每个读或者写数据的操作方法都必须加锁进行同步,如果没有正确的同步,就无法保证一个线程所做的修改被其他线程共享。未能同步共享变量会造成程序的活性失败和安全性失败,这样的失败通常是难以调试和重现的,它们可能间歇性地出问题,可能随着并发的线程个数增加而失败,也可能在不同的虚拟机或者操作系统上存在不同的失败概率。因此,务必要保证锁的正确使用。下面这个案例,就是个典型的错误应用。

int size = 0;

public synchronized void increase()

{

size++;

}

public int current()

{

Return size;

}

Netty的并发编程实践1:正确使用锁相关推荐

  1. java并发编程实践_Java并发编程实践如何正确使用Unsafe

    一.前言 Java 并发编程实践中的话: 编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各 ...

  2. Java并发编程实战_一线大厂架构师整理:java并发编程实践教程

    并发编程是Java语言的重要特性之一, 在Java平台上提供了许多基本的并发功能来辅助开发多线程应用程序.然而,这些相对底层的并发功能与上层应用程序的并发语义之间并不存在一种简单而直观的映射关系.因此 ...

  3. auto.js停止所有线程_Java线程与并发编程实践:深入理解volatile和final变量

    同步有两种属性:互斥性和可见性.synchronized关键字与两者都有关系.Java同时也提供了一种更弱的.仅仅包含可见性的同步形式,并且只以volatile关键字关联. 假设你自己设计了一个停止线 ...

  4. 《Java线程与并发编程实践》—— 2.3 谨防活跃性问题

    本节书摘来异步社区<Java线程与并发编程实践>一书中的第2章,第2.3节,作者: [美]Jeff Friesen,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  5. java并发编程实践(2)线程安全性

    [0]README 0.0)本文部分文字描述转自:"java并发编程实战", 旨在学习"java并发编程实践(2)线程安全性" 的相关知识: 0.1)几个术语( ...

  6. java并发编程实践(1)intro

    [0]README 0.1)本文部分文字描述转自"java并发编程实践",旨在学习"java并发编程实践(1)intro"的相关知识: [3]线程带来的风险 [ ...

  7. JAVA并发编程实践笔记

    2019独角兽企业重金招聘Python工程师标准>>> JAVA并发编程实践笔记 博客分类: java JAVA并发编程实践笔记 1, 保证线程安全的三种方法:     a, 不要跨 ...

  8. 《Java线程与并发编程实践》—— 2.6 小结

    本节书摘来异步社区<Java线程与并发编程实践>一书中的第2章,第2.6节,作者: [美]Jeff Friesen,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  9. [Java 并发] Java并发编程实践 思维导图 - 第一章 简单介绍

    阅读<Java并发编程实践>一书后整理的思维导图.

  10. 《Java并发编程实践》学习笔记之一:基础知识

    <Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念:  (2)进程:是一种活动,它是由一个动作序列组成 ...

最新文章

  1. iscsi发起程序找不到目标_3分钟学会程序员“面试回答规范”,不怕找不到工作的里面请...
  2. 企业级 WEB 报表工具——FineReport
  3. 深度学习笔记之使用Faster-Rcnn进行目标检测 (原理篇)
  4. 在 Windows 中,当一个应用程序窗口被关闭,该应用程序将会保留在哪里?
  5. plc维修入门与故障处理实例_电气控制基础+PLC编程入门+工程应用实例
  6. 苹果更新watchOS 7.3.1:修复Apple Watch进入省电模式后无法充电的问题
  7. 来自百度的71款开源项目
  8. 人大金仓数据库软件下载
  9. DMG计算机,传授dmg文件怎么打开
  10. 北京大学软件与微电子学院嵌入式系统工程系
  11. 框架设计--第六章 初识MyBatis--习题答案
  12. 有监督机器学习训练流程---人工智能工作笔记0015
  13. Flutter IOS 提交AppStore 审核失败
  14. Word 中章节标题前的方形黑点消失与显示
  15. 手把手教你在Linux系统进行项目部署
  16. Java io流详解四
  17. ORA-12514: TNS:listener does not currently know of service requested in connect descript
  18. 自动化测试工程师的发展前景怎么样?好不好?
  19. 2023四川农业大学计算机考研信息汇总
  20. iOS获取局域网的IP

热门文章

  1. mysql transaction 实践小问题
  2. 微信开发之调起摄像头、本地展示图片、上传下载图片
  3. 详解Oracle数据货场中三种优化:分区、维度和物化视图
  4. ram_flash驱动
  5. 条码扫描二维码扫描—ZXing android 改进版本
  6. linux 编译安装nginx,配置自启动脚本
  7. PHP SPhinx::SetLimits 注意事项
  8. NSXMLParser详解(事例)
  9. PaddlePaddle(6)—— 基于Hub Serving的微信小程序模型部署
  10. GoogleTest测试框架介绍(一)