并发性

【Java并发性和多线程】线程安全与共享资源

岁酱吖の 提交于 2020-04-17 03:37:35
【推荐阅读】微服务还能火多久?>>> 本文为转载学习 原文链接: http://tutorials.jenkov.com/java-concurrency/thread-safety.html 译文链接: http://ifeve.com/thread-safety/ 允许被多个线程同时执行的代码称作线程安全的代码。线程安全的代码不包含竞态条件。当多个线程同时更新共享资源时会引发竞态条件。因此,了解Java线程执行时共享了什么资源很重要。 局部变量 局部变量存储在线程自己的栈中。也就是说,局部变量永远也不会被多个线程共享。所以,基础类型的局部变量是线程安全的。下面是基础类型的局部变量的一个例子: public void someMethod(){ long threadSafeInt = 0; threadSafeInt++; } 局部的对象引用 对象的局部引用和基础类型的局部变量不太一样。尽管引用本身没有被共享,但引用所指的对象并没有存储在线程的栈内。所有的对象都存在共享堆中。如果在某个方法中创建的对象不会逃逸出( 译者注:即该对象不会被其它方法获得,也不会被非局部变量引用到 )该方法,那么它就是线程安全的。实际上,哪怕将这个对象作为参数传给其它方法,只要别的线程获取不到这个对象,那它仍是线程安全的。下面是一个线程安全的局部引用样例: public void someMethod

【Java并发性和多线程】竞态条件与临界区

老子叫甜甜 提交于 2020-04-17 03:37:10
【推荐阅读】微服务还能火多久?>>> 本文为转载学习 原文链接: http://tutorials.jenkov.com/java-concurrency/race-conditions-and-critical-sections.html 译文链接: http://ifeve.com/race-conditions-and-critical-sections/ 在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。如,同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件。实际上,这些问题只有在一或多个线程向这些资源做了写操作时才有可能发生,只要资源没有发生变化,多个线程读取相同的资源就是安全的。 多线程同时执行下面的代码可能会出错: public class Counter { protected long count = 0; public void add(long value){ this.count = this.count + value; } } 想象下线程A和B同时执行同一个Counter对象的add()方法,我们无法知道操作系统何时会在两个线程之间切换。JVM并不是将这段代码视为单条指令来执行的,而是按照下面的顺序: 从内存获取 this.count 的值放到寄存器 将寄存器中的值增加value

【Java并发性和多线程】Java中的锁

你离开我真会死。 提交于 2019-11-29 23:26:47
本文为转载学习 原文链接: http://ifeve.com/locks/ 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂。因为锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,所以我们还不能完全摆脱synchronized关键字( 译者注:这说的是Java 5之前的情况 )。 自Java 5开始,java.util.concurrent.locks包中包含了一些锁的实现,因此你不用去实现自己的锁了。但是你仍然需要去了解怎样使用这些锁,且了解这些实现背后的理论也是很有用处的。可以参考我对 java.util.concurrent.locks.Lock 的介绍,以了解更多关于锁的信息。 以下是本文所涵盖的主题: 一个简单的锁 锁的可重入性 锁的公平性 在finally语句中调用unlock() 一个简单的锁 让我们从java中的一个同步块开始: public class Counter{ private int count = 0; public int inc(){ synchronized(this){ return ++count; } } } 可以看到在inc()方法中有一个synchronized(this)代码块。该代码块可以保证在同一时间只有一个线程可以执行return +

【Java并发性和多线程】Java并发性和多线程介绍

陌路散爱 提交于 2019-11-29 15:28:21
本文为转载学习 原文链接: http://tutorials.jenkov.com/java-concurrency/index.html 译文链接: http://ifeve.com/java-concurrency-thread/ 在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。 随着多任务对软件开发者带来的新挑战,程序不在能假设独占所有的CPU时间、所有的内存和其他计算机资源。一个好的程序榜样是在其不再使用这些资源时对其进行释放,以使得其他程序能有机会使用这些资源。 再后来发展到多线程技术,使得在一个程序内部能拥有多个线程并行执行。 一个线程的执行可以被认为是一个CPU在执行该程序。当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序。 多线程比多任务更加有挑战。 多线程是在同一个程序内部并行执行,因此会对相同的内存空间进行并发读写操作。 这可能是在单线程程序中从来不会遇到的问题。其中的一些错误也未必会在单CPU机器上出现,因为两个线程从来不会得到真正的并行执行。然而, 更现代的计算机伴随着多核CPU的出现

【Java并发性和多线程】Java同步块

荒凉一梦 提交于 2019-11-29 04:53:04
本文为转载学习 原文链接: http://tutorials.jenkov.com/java-concurrency/synchronized.html 译文链接: http://ifeve.com/synchronized-blocks/ Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容: Java同步关键字(synchronzied) 实例方法同步 静态方法同步 实例方法中同步块 静态方法中同步块 Java同步示例 Java 同步关键字( synchronized ) Java中的同步块用synchronized标记。同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作。所有其他等待进入该同步块的线程将被阻塞,直到执行该同步块中的线程退出。 有四种不同的同步块: 实例方法 静态方法 实例方法中的同步块 静态方法中的同步块 上述同步块都同步在不同对象上。实际需要那种同步块视具体情况而定。 实例方法同步 下面是一个同步的实例方法: package com.ticmy.classloader; public synchronized void add(int value){ this.count += value; } 注意在方法声明中同步