synchronized

Java多线程与并发控制

一个人想着一个人 提交于 2019-12-28 05:29:01
三、线程的几种状态   在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。   第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。   第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。   第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。   第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。 sleep ,suspend, wait(两者的区别是是否释放锁) 等方法都可以导致线程阻塞。   第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪 synchronized关键字使用说明 synchronized只能标记非抽象的方法,不能标识成员变量。 要同步静态方法,需要一个用于整个类对象的锁,这个对象是就是这个类(XXX.class)。 例如: public static synchronized int setName(String name){

线程安全问题

淺唱寂寞╮ 提交于 2019-12-27 15:13:58
本篇主要讲解 线程安全问题,演示什么情况下会出现线程安全问题,以及介绍了 Java内存模型 、volatile关键字 、CAS 等 ,最后感谢吴恒同学的投稿! 一起来了解吧!!  1. 如何会发生线程安全  运行如下程序: /** * @program: * @description: 多线程操作的对象 * @author: * @create: **/ public class MyCount { private int myCount = 0 ; public int getMyCount() { return myCount; } public void setMyCount(int myCount) { this.myCount = myCount; } @Override public String toString() { return "MyCount{" + "myCount=" + myCount + '}'; } }  创建线程 public class CountThread1 extends Thread{ private MyCount myCount ; private static Object synch = new Object(); public CountThread1( MyCount myCount) { this.myCount =

What is the difference between a synchronized method and synchronized block in Java? [duplicate]

别来无恙 提交于 2019-12-27 12:23:35
问题 This question already has answers here : Is there an advantage to use a Synchronized Method instead of a Synchronized Block? (23 answers) Closed 2 years ago . What is the difference between a synchronized method and synchronized block in Java ? I have been searching the answer on the Net, people seem to be so unsure about this one :-( My take would be there is no difference between the two, except that the synch block might be more localized in scope and hence the lock will be of lesser time

What is the difference between a synchronized method and synchronized block in Java? [duplicate]

ⅰ亾dé卋堺 提交于 2019-12-27 12:23:27
问题 This question already has answers here : Is there an advantage to use a Synchronized Method instead of a Synchronized Block? (23 answers) Closed 2 years ago . What is the difference between a synchronized method and synchronized block in Java ? I have been searching the answer on the Net, people seem to be so unsure about this one :-( My take would be there is no difference between the two, except that the synch block might be more localized in scope and hence the lock will be of lesser time

What is the difference between a synchronized method and synchronized block in Java? [duplicate]

北慕城南 提交于 2019-12-27 12:21:29
问题 This question already has answers here : Is there an advantage to use a Synchronized Method instead of a Synchronized Block? (23 answers) Closed 2 years ago . What is the difference between a synchronized method and synchronized block in Java ? I have been searching the answer on the Net, people seem to be so unsure about this one :-( My take would be there is no difference between the two, except that the synch block might be more localized in scope and hence the lock will be of lesser time

java 多线程 volatile 与 synchronized

一世执手 提交于 2019-12-27 07:17:39
https://www.cnblogs.com/hapjin/p/5492880.html 三,volatile 与 synchronized 的比较 volatile主要用在多个线程感知实例变量被更改了场合,从而使得各个线程获得最新的值。它强制线程每次从主内存中讲到变量,而不是从线程的私有内存中读取变量,从而保证了数据的可见性。 关于synchronized,可参考: JAVA多线程之Synchronized关键字--对象锁的特点 比较: ①volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法 ②volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。 synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。 四,线程安全性 线程安全性包括两个方面,①可见性。②原子性。 从上面自增的例子中可以看出:仅仅使用volatile并不能保证线程安全性。而synchronized则可实现线程的安全性。 来源: CSDN 作者: 我叫周利东 链接: https://blog.csdn.net/qq_36951116/article/details/103660219

浅析 Java volatile 变量

99封情书 提交于 2019-12-27 05:23:21
1.Java内存模型(Java Memory Model) Java内存模型(JMM),不同于Java运行时数据区,JMM的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中读取数据这样的底层细节。JMM规定了所有的变量都存储在 主内存 中,但每个线程还有自己的 工作内存(CPU内存) ,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝。线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量,工作内存是线程之间独立的,线程之间变量值的传递均需要通过主内存来完成。 2. volatile关键字 volatile 是 Java 中的一个关键字。 当一个变量被定义为volatile之后,就可以保证此变量对所有线程的可见性,即当一个线程修改了此变量的值的时候,变量新的值对于其他线程来说是可以立即得知的。可以理解成: 对volatile变量所有的写操作都能立刻被其他线程得知 。但是这并不代表基于volatile变量的运算在并发下是安全的,因为volatile只能保证内存可见性,却没有保证对变量操作的原子性。 2.1 强制线程直接从内存中读写线程 volatile 关键字的典型使用场景是在多线程环境下,多个线程共享变量,由于这些变量会缓存在 CPU 的缓存中,为了避免出现内存一致性错误而采用 volatile 关键字。考虑下面这个生产者

Java volatile关键字

半世苍凉 提交于 2019-12-27 05:22:21
Java volatile关键字 2013-03-27 15:29 89人阅读 评论 (0) 收藏 举报 1、什么是原子操作(atomic operation)? 原子操作是不需要synchronized. 所谓原子操作,是指不会被线程调度机制打断的操作。这种操作,一但开始,就一直运行到结束,中间不会有任何的context switch。 原子性不可能由软件单独保证--必须需要硬件的支持,因此是和架构相关的。 2、锁的作用 锁提供了两种主要特性:互斥(mutual exclusion)和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实 现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据 做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或 不一致的值,这将引发许多严重问题。 3、类型描述符volatile Java语言包含两种内在的同步机制:同步块synchronized(或方法 或者lock)和 volatile 变量。这些机制的提出都是为了线程安全。 Volatile 变量的同步性较差(但有时它更简单并且开销更低),Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的

重入锁

点点圈 提交于 2019-12-27 05:12:21
锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized(重量级) 和 ReentrantLock(轻量级)等等 ) 。这些已经写好提供的锁为我们开发提供了便利。 重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。 在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁 代码演示 public class Test implements Runnable { static Boolean flag = true ; public synchronized void get ( ) { System . out . println ( "name:" + Thread . currentThread ( ) . getName ( ) + " get();" ) ; try { Thread . sleep ( 2000 ) ; } catch ( InterruptedException e ) { e . printStackTrace ( ) ; } set ( ) ; } public synchronized void set ( ) { System . out . println ( "name:" + Thread .

并发编程之互斥锁

此生再无相见时 提交于 2019-12-27 00:39:54
原子性问题的源头是线程切换,如果能够禁用线程切换那不就能解决这个问题了吗?而操作系统做线程切换是依赖 CPU 中断的,所以禁止 CPU 发生中断就能够禁止线程切换。 在早期单核 CPU 时代,这个方案的确是可行的,而且也有很多应用案例,但是并不适合多核场景。这里我们以 32 位 CPU 上执行 long 型变量的写操作为例来说明这个问题,long 型变量是 64 位,在 32 位 CPU 上执行写操作会被拆分成两次写操作(写高 32 位和写低 32 位,如下图所示)。 在单核 CPU 场景下,同一时刻只有一个线程执行,禁止 CPU 中断,意味着操作系统不会重新调度线程,也就是禁止了线程切换,获得 CPU 使用权的线程就可以不间断地执行,所以两次写操作一定是:要么都被执行,要么都没有被执行,具有原子性。但是在多核场景下,同一时刻,有可能有两个线程同时在执行,一个线程执行在 CPU-1 上,一个线程执行在 CPU-2 上,此时禁止 CPU 中断,只能保证 CPU 上的线程连续执行,并不能保证同一时刻只有一个线程执行,如果这两个线程同时写 long 型变量高 32 位的话,那就有可能出现诡异 Bug 。 “同一时刻只有一个线程执行”这个条件非常重要,我们称之为互斥。如果我们能够保证对共享变量的修改是互斥的,那么,无论是单核 CPU 还是多核 CPU,就都能保证原子性了。 锁模型如下图: