在网络上看了很多关于他们两个的区别与联系,今天用自己的话表述一下: synchronized 容易理解,给一个方法或者代码的一个区块加锁,那么需要注意的是,加锁的标志位默认是this对象,当然聪明的你可能想我能不能不用this对象而使用其他的哪?答案是肯定的 volatile 说volatile就不得不说JAVA的内存模型,java的每一个线程都有自己的指定的内存区域,而且又有共同的主内存区域,当操作计算的时候,会从主内存区域将变量拷贝到自己的内存区域,再计算,计算之后再写回去,那么问题就来了,…
你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough 现陆续将Demo代码和技术文章整理在一起 Github实践精选 ,方便大家阅读查看,本文同样收录在此,觉得不错,还请Star 之前写了几篇 Java并发编程的系列 文章,有个朋友微群里问我,还是不能理解 volatile 和 synchronized 二者的区别, 他的问题主要可以归纳为这几个:…
原文地址:https://segmentfault.com/a/1190000004487149.感谢作者的无私分享. 你是否真正理解并会用volatile, synchronized, final进行线程间通信呢,如果你不能回答下面的几个问题,那就说明你并没有真正的理解: 对volatile变量的操作一定具有原子性吗? synchronized所谓的加锁,锁住的是什么? final定义的变量不变的到底是什么? java内存模型 内存模型 看java内存模型之前,我们先来看看什么是内存模型? 在…
这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍. 相似点:这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作系统需要在用户态与内核态之间来回切换,代价很高,不过可以通过对锁优化进行改善). 功能区别:这两种方式最大区别就是对于Synchronized来说,它是…
今天一起来认识认识 synchronized 这个一面试就会被提到的关键字.这一篇不会讲太多理论,主要先熟悉熟悉一下最简单的用法.只讨论一个问题:方法没用 synchronized 和用了 synchronized 有什么区别? 首先我们的理论基础是 synchronized 关键字是用在多线程并发的场景,所以接下来的测试代码都会模拟多线程并发的情况.我们直接通过代码来给大家讲讲加没加 synchronized 的区别. 1. 方法没加 synchronized 关键字 我们先写一个普通到不能再…
下列说法正确的是()? A.我们直接调用Thread对象的run方法会报异常,所以我们应该使用start方法来开启一个线程 B.一个进程是一个独立的运行环境,可以被看做一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和程序的单一进程.线程可以被称为轻量级进程.线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源 C.synchronized可以解决可见性问题,volatile可以解决原子性问题 D.ThreadLocal用于创建线程的本地变量…
 1,volatile 它所修饰的变量不保留拷贝,直接访问主内存中的.    在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器).为了性能,一个线程会在自己的memory中保持要访问的变量的副本.这样就会出现同一个变 量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,或者main memory中的值不一致的情况. 一个变量声明为volatile,就意味着这个变量是随时会被其他线程修改的,因此不能将它cache在线程mem…
这是美团一面面试官的一个问题,后来发现这是一道面试常见题,怪自己没有准备充分:i++;在多线程环境下是否存在问题?当时回答存在,接着问,那怎么解决?...好吧,我说加锁或者synchronized同步方法.接着问,那有没有更好的方法? 经过一番百度.谷歌,还可以用AtomicInteger这个类,这个类提供了自增.自减等方法(如i++或++i都可以实现),这些方法都是线程安全的. 一.补充概念 1.什么是线程安全性? <Java Concurrency in Practice>中有提到:当多个…
原文链接:http://www.cnblogs.com/zhengbin/p/5653051.html 一.补充概念 1.什么是线程安全性? <Java Concurrency in Practice>中有提到:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的. 2.Java中的“同步” Java中的主要同步机制是关键字“synchronized”,它提供了一种独占的加锁方式,但“同步”这个术语还包括volatile类型的变量,显式锁(Explicit Loc…
最近在学习多线程,现在进行总结一下吧.首先要了解一下以下几个名词. (1)wait:当线程调用wait()方法时,当前该线程会进入阻塞状态,且释放锁,使用wait方法的时候,必须配合synchronized使用. (2)notify:当线程调用notify()方法时,会唤醒一个处于等待该对象锁的线程,不释放锁,使用notify方法的时候,必须配合synchronized使用. (3)sleep:当线程调用sleep()方法时,会让出CPU执行权,不释放锁.当指定的时间到了后,会自动恢复运行状态.…