Java 并发编程实战》学习笔记01 | 可见性、原子性和有序性问题:并发编程Bug的源头可见性:一个线程对共享变量的修改,另一个线程能立刻看到缓存导致的可见性问题:多核时代每颗 CPU 都有自己的缓存,这时 CPU 缓存(三级缓存)与内存的数据一致性就容易出现问题了,当多个线程在不同的 CPU 上执行时,这些线程操作的是不同的 CPU 缓存。比如,线程 A 操作的是 CPU-1 上的缓存,而线
java中断机制 http://ifeve.com/java-interrupt-mechanism/ Ask、现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?join方法如果一个线程A执行了thread.join()语句,其含义是当前线程A等待thread线程终止后才从thread.join()返回join有两个超时特性的方法,如果在
转载 2023-06-12 14:31:22
132阅读
第12章 并发程序的测试大致分为两类:安全性测试和活跃性测试12.1 正确性测试找出需要检查的不变性条件和后验条件。接下来将构建一组测试用例来测试一个有界缓存。程序清单12-1给出了BoundedBuffer的实现,其中使用Semaphore来实现缓存的有界属性和阻塞行为。      BoundedBuffer实现了一个固定长度的队列,其中定义了可阻塞的pu
为类的用户编写线程安全性担保的文档;为类的维护者编写类的同步策略文档。java.text.SimpleDateFormat并不是线程安全的,如果一个类没有明确指明,就不要假设他是线程安全的。另一方面,倘若不对容器提供的对象(比如HttpSession)的线程安全性做出一些合理的假设,又不可能开发一个基于Servlet的应用。在设计同步容器返回的迭代器时,并没有考虑到并发修改的问题,当他们察觉容器在
转载 2024-05-31 17:41:53
65阅读
    最近工作中需要用到并发以提高模块性能,之前对这一块的认识太浅薄并且缺少相关实践,以至于跟大神们讨论方案时经常被问住,遂决定利用空闲时间好好看看并发,多线程,高性能服务器这方面的知识,跟同事交流了下,这块的经典书籍还是不少的,《java并发编程实战》据说是公认的经典,就从它开始吧~    btw,关于如果选择书籍,我又想起了那句话:
转载 2024-01-15 21:26:16
114阅读
第1章 简介第2章 线程安全性1个状态变量线程安全的模式 多个状态变量线程不安全的模式,在A线程lastNumbers.set和lastFactors.set之间B线程进行这两个set就出问题了, AtomicReference是替代对象引用的线程安全类 使用synchronized性能很差 synchronized是可重入锁,下面实例先获得LoggingWidget的对象锁(
java并发编程实践基础(一) ---------- 1. 继承Thread创建线程 继承java.lang.Thread类创建线程是最简单的一种方法,也最直接。下面创建一个MyThread1类,继承Thread,重写其run()方法。并在main()方法中创建多个并发线程。package simplethread; public class
转载 2024-02-10 21:02:30
65阅读
Java并发编程实战第一章 简介1.1 并发简史 之所以在计算机加入操作系统来实现多个程序同时执行,主要基于以下原因:资源利用率:在某些程序中,可能需要执行非常耗时的操作,而这些操作往往不需要使用CPU,例如IO操作,此时CPU处于空闲状态,对于CPU而言,是个极大的浪费。如果在这种情况下,我们同时间运行另一个需要占用CPU的程序,无疑是提高了CPU的利用率。公平性:不同用户和程序对计算机的资源有
一、悲观锁和乐观锁在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有独占锁. 我们在系列java并发线程实战(1)线程安全和机制原理,已经提到例子,private volatile int count = 0; public void doAdd(CountDownLatch countDownLatch) { for (int i = 0
转载 2023-07-20 17:32:05
308阅读
java并发编程实战学习 第3章第1章 简介 第2章 线程安全性 第3章 对象的共享同步除了“互斥”还有另外一个重要的方面:内存可见性。例子:主线程启动读线程,然后将number设为42,ready设为true。读线程一致循环直到发现ready的值为true,然后输出number的值。虽然看起来会输出42,但是可能输出0,或者根本无法终止。public class NoVisibility {
package cn.xuetao.test; public class Test1 extends Thread { @Override public void run() { System.out.println("这里执行的是test1的run方法"); } public static void main(String[] args) { Test1 t1 =
java线程并行安全/* 题目:同时存款和取款,因为线程并行而出现的数据显示问题。 思路: 1,定义一个账户(有账户id和剩余金额) 2,定义两个任务,一个取钱,一个存钱,操纵同一个账户内的剩余金额 3,在取钱线程判断语句执行后,使线程睡眠(100)微秒 原因: 1,假如现在id为1的客户,银行账户内有100元 2,他再往支付宝上
转载 2023-08-09 12:25:16
79阅读
 Ask、现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?join方法如果一个线程A执行了thread.join()语句,其含义是当前线程A等待thread线程终止后才从thread.join()返回join有两个超时特性的方法,如果在超时时间内thread还没有执行结束,则从该超时方法返回 Ask、在Java中Lock接口比synch
线程安全 线程安全的重要性不言而喻,两个并发的线程如果有一个共享数据,如果没有采用任何的安全措施,那这个数据几乎一定会被破坏,这里看个例子。 public class App { public static void main(String[] args) throws Exception { co ...
转载 2021-07-23 19:52:00
71阅读
2评论
一.并发理论基础并发编程Bug源头:https://limeng.blog.csdn.net/article/details/109020395Java内存模型(解决可见性和有序性问题):https://limeng.blog.csdn.net/article/details/109262247互斥锁:https://limeng.blog.csdn.net/article/details/109551131死锁:https://limeng.blog.csdn.net/article/detai
原创 2021-08-31 09:10:48
123阅读
1,不变性当满足以下条件时,对象才是不可变的:- 对象创建以后其状态就不可修改- 对象的所有域都是 final 类型- 对象是正确创建的(在对象的构造期间,this 引用没有逸出)从技术上来看,不可变对象并不需要将其所有的域都声明为 final 类型,例如 String 就是这种情况,这就要对类的良性数据竞争情况做精确的分析,因此需要深入理解 Java 的内存模型。…… 自己在编码时不要这么做。2
转载 2023-05-11 12:01:02
103阅读
一.并发理论基础并发编程Bug源头:https://limeng.blog..net/article/details/109020395Java内存模型(解决可见性和有序性问题)
原创 2022-01-11 14:18:13
117阅读
第4章主要介绍如何构造线程安全类。在设计线程安全类的过程中,需要包含以下三个基本要素:找出构成对象状态的所有变量。找出约束状态变量的不变性条件。建立对象状态的并发访问管理策略。 构造线程安全类常采用的技术如下:实例封闭     当一个对象被封装到另一个对象中时,能够访问被封装对象的所有代码路径都是已知的。与对象可以由整个程序访问的情况相比,更易于对
目录1,查看线程的方法2,Java 线程的创建方式1,继承 Thread 类2,实现 Runnable 接口3,实现 Callable 接口3,Java 线程池4,Java 线程同步 synchronized5,Java 中的锁 Lock1,Lock 接口2,ReentrantLock 类3,synchronized 与 Lock 对比4,ReadWriteLock 接口5,锁的分类6,死锁6,
 《java并发编程实战》这本书配合并发编程网中的并发系列文章一起看,效果会好很多。并发系列的文章链接为:  Java并发性和多线程介绍目录建议: 《java并发编程实战》第3章和第4章可以暂时先跳过。。这部分内容的文字和概念很多,代码块偏少。不容易看进去。 一、线程1.线程的使用可以提升程序的性能。2.线程如果没有同步,操作的执行顺序是不可预测的。3.线程之间共享数
  • 1
  • 2
  • 3
  • 4
  • 5