synchronized

这篇文章带你彻底理解synchronized

懵懂的女人 提交于 2019-12-04 00:50:32
本人免费整理了Java高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,需要自己领取。 传送门 : https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q 1. synchronized简介 在学习知识前,我们先来看一个现象: public class SynchronizedDemo implements Runnable { private static int count = 0; public static void main(String[] args) { for (int i = 0; i < 10; i++) { Thread thread = new Thread(new SynchronizedDemo()); thread.start(); } try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("result: " + count); } @Override public void run() { for (int i = 0; i < 1000000; i++)

Cost of synchronization

醉酒当歌 提交于 2019-12-04 00:42:14
问题 In a highly concurrent Java program and assuming that my methods are correctly written and correctly synchronized, I am wondering about how to determine which is better: void synchronized something() { ... } or void something() { synchronized(this) { ... } // here do stuff no requiring synchronization . . // do computation 'A' . synchronized(this) { ... } // here do other stuff no requiring synchronization . . // do computation 'B' . synchronized(this) { ... } } Now I realize that if

java基础: synchronized与Lock的区别

為{幸葍}努か 提交于 2019-12-04 00:04:55
主要区别   1. 锁机制不一样:synchronized是java内置关键字,是在JVM层面实现的,系统会监控锁的释放与否,lock是JDK代码实现的,需要手动释放,在finally块中释放。可以采用非阻塞的方式获取锁;   2. 性能不一样:资源竞争激励的情况下,lock性能会比synchronize好,竞争不激励的情况下,synchronize比lock性能好,synchronize会根据锁的竞争情况,从偏向锁-->轻量级锁-->重量级锁升级,而且编程更简单   3. synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;   4. synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;   5. 用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;   6. synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)   7. 用法不一样:synchronize可以用在代码块上,方法上

Lombok 学习指南

与世无争的帅哥 提交于 2019-12-03 23:35:07
转自:https://segmentfault .com /a/11900000208 64 572 一、Lombok 简介 Lombok 是一款 Java 开发插件,使得 Java 开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的 Java 模型对象(POJO)。 在开发环境中使用 Lombok 插件后,Java 开发人员可以节省出重复构建,诸如 hashCode 和 equals 这样的方法以及各种业务对象模型的 accessor 和 toString 等方法的大量时间。 对于这些方法,Lombok 能够在编译源代码期间自动帮我们生成这些方法,但并不会像反射那样降低程序的性能。 二、Lombok 安装 2.1 构建工具 Gradle 在 build.gradle 文件中添加 lombok 依赖: dependencies { compileOnly 'org.projectlombok:lombok:1.18.10' annotationProcessor 'org.projectlombok:lombok:1.18.10' } Maven 在 Maven 项目的 pom.xml 文件中添加 lombok 依赖: <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok

Java: Is volatile / final required for reference to synchronized object?

こ雲淡風輕ζ 提交于 2019-12-03 23:32:47
This seems a pretty basic issue, but I cannot find a clear confirmation. Let's say I have a class properly synchronized in itself: public class SyncClass { private int field; public synchronized void doSomething() { field = field * 2; } public synchronized void doSomethingElse() { field = field * 3; } } If I need to have a reference to an instance of that class, shared between threads, I do still need to declare that instance volatile or final , am I right? As in: public class MainClass { // previously OuterClass public static void main(String [ ] args) { final SyncClass mySharedObject = new

Java 高并发之魂

放肆的年华 提交于 2019-12-03 23:13:04
前置知识 了解Java基本语法 了解多线程基本知识 知识介绍 Synchronized简介:作用、地位、不控制并发的后果 两种用法: 对象锁 和 类锁 多线程访问同步方法的 7种 情况:是否是static、Synchronized方法等 Synchronized的 性质 :可重入、不可中断 原理 :加解锁原理、可重入原理、可见性原理 Synchronized的缺陷:效率低、不够灵活、无法预判是否成功获取锁 常见问题: 如何选择Lock或Synchronized等 如何提高性能、JVM如何解决那个线程获取锁等 Synchronized简介 作用 官方解释   同步方法支持一种简单的策略来防止线程干扰和内存一致性错误:如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成的。 通俗易懂的解释   能够保证在 同一时刻 最多只有 一个 线程执行该段代码,以达到保证并发安全的效果。 地位 Synchronized是Java的 关键字 ,被Java语言原生支持 代码演示:不使用并发手段的 后果 演示 代码实战:两个线程同时a++,最后结果会比预计的少 原因   count++,它看上去只是一个操作,实际上包含了三个动作: 读取count 将count加1 将count的值写入到内存中 最基本 的互斥同步手段 并发编程中的 元老级 角色,是并发编程的 必学 内容

四:Java设计模式之单例模式

a 夏天 提交于 2019-12-03 23:05:02
一、单例模式 单例模式一种常用的软件设计模式,在它的核心结构中值包含一个被称为单例的特殊类。一个类只有一个实例,即一个类只有一个对象实例。在spring框架中也是保证了所管理的对象都是单例模式; 二、常用的单例模式 1、饿汉单例 // 它是在类加载的时候就立即初始化,并且创建单例对象 //优点:没有加任何的锁、执行效率比较高, //在用户体验上来说,比懒汉式更好 //缺点:类加载的时候就初始化,不管你用还是不用,我都占着空间 //浪费了内存,有可能占着茅坑不拉屎 //绝对线程安全,在线程还没出现以前就是实例化了,不可能存在访问安全问题 public class HungrySingleton { //私有的构造函数 private HungrySingleton() { } private static final HungrySingleton hungrySingleton = new HungrySingleton(); public static HungrySingleton getInstance() { return hungrySingleton; } }   //静态块写法实现饿汉单例 public class HungryStaticSingleton { private HungryStaticSingleton() { } private static

Java理论与实践:正确使用volatile 变量

蓝咒 提交于 2019-12-03 22:25:55
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized ”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。 锁提供了两种主要特性: 互斥(mutual exclusion) 和 可见性(visibility) 。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。 Volatile 变量 Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器

volatile 变量使用指南

喜夏-厌秋 提交于 2019-12-03 22:25:45
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized ”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。 锁提供了两种主要特性: 互斥(mutual exclusion) 和 可见性(visibility) 。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。 Volatile 变量 Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器

正确使用 Volatile

只谈情不闲聊 提交于 2019-12-03 22:25:14
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized ”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。 锁提供了两种主要特性: 互斥(mutual exclusion) 和 可见性(visibility) 。互斥即一次 只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些, 它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。 Volatile 变量 Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器