synchronized

设计模式-单例模式学习笔记

匿名 (未验证) 提交于 2019-12-03 00:08:02
DCL、Holder(静态内部类)和饿汉式单例都可以通过反射或者序列化破坏。 直接用枚举单例就完事了。 场景:多线程情况下操作相同对象应该是同一个对象。例如文件。 在实例化过程中,所有的对象只实例化一次。 需要实现一个实例化的过程并且向用户提供一个返回实例对象的方法。 线程安全性。 性能。 懒加载。 饿汉式 在加载时就产生实例化对象存放在堆中,后续使用时只会取到同一个实例化对象,故判断其线程安全。(Ref:JVM ClassLoader)。 不存在延迟加载的情况,长时间不使用仍然会保存在堆内存中,若单例数据较大的时候会产生内存浪费,甚至可能会产生内存溢出影响性能。 因此比较适合少量数据的单例模式。 public class HungrySingleton { private byte[] data=new byte[1024]; private static HungrySingleton instatance=new HungrySingleton(); private HungrySingleton(){ } public static HungrySingleton getInstance(){ return instatance; } } 懒汉式 为了克服单例对象数据较大且还未被使用时造成的内存浪费,将饿汉式做出一定改变,在首次使用时才进行加载。 懒汉式并非线程安全的

关于synchronize与lock的区别

匿名 (未验证) 提交于 2019-12-03 00:04:02
参考文献: https://www.cnblogs.com/cloudblogs/p/6440160.html 一、synchronize修饰不同代码都是锁住了什么? 大家都知道synchronize可以修饰属性、代码块,方法、类,但是修饰不同的代码锁住的内容是不同的。 1、修饰 非静态属性和方法 时,拿到的是调用这个方法或者属性的 对象(this)的锁 。 2、synchronize()修饰代码块时,拿到的是 指定对象的锁 。 3、 修饰类、静态方法、静态代码块 时,由于没有this指针,因此拿到的是 类锁,也就是该类的class对象 。 !!!注意:一个对象只有一个锁 二、关于synchronize 由于synchronize是由JVM实现的,因此当加锁代码出现异常时,对象锁可以由JVM释放,包含以下三种情况: 1、 占有锁的线程执行完了代码块,然后释放对锁的占有; 2、 占有锁的线程发生了异常,此时JVM会让线程自动释放锁; 3、 占有锁的线程调用了wait()方法,从而进入了WAITING状态需要释放锁。 三、关于Lock 1 Lock lock = ...; lock.lock(); 2 try{ 3    //处理任务 4 }catch(Exception ex){ 5 }finally{ 6 lock.unlock(); //释放锁 7 } 1 Lock lock =

volatile实现原理

匿名 (未验证) 提交于 2019-12-03 00:03:02
从内存中把数据读到Cache 在Cache中更新数据 把Cache中数据更新到内存 MESI() 读操作:不做任何事情,把Cache中的数据读到寄存器 写操作:发出信号通知其他的CPU将该变量的Cache line置为无效,其他的CPU要访问这个变量的时候,只能从内存中获取。 Cache line CPU的cache中会增加很多的Cache line 主内存数据所有线程都可以访问(共享变量) 每个线程都有自己的工作空间(本地内存) 工作空间:局部变量、主内存的副本 线程不能直接修改主内存的数据,只能将数据读到工作空间,修改完刷新到主内存 对共享变量的修改,可以让其他线程感知到。 不能保证原子性。 使用lock锁; 当某个线程将volatile修饰的变量改变的时候,会将该变量的Cache line置为失效; 其他线程感知到Cache Line失效,会重新去主存获取该变量。 lock是汇编中的指令; Cache line是硬件中的指令。 编译阶段、cpu指令优化阶段; 代码顺序并不是实际的执行顺序。 volatile修饰的变量位置不变 (即volatile前的代码不能放到volatile之后,volatile后的代码不能放到volatile之前) 加了轻量锁Lock volatile只能修饰变量,synchronized只能修饰方法和代码块 volatile不能保证原子性

设计模式之单例模式

匿名 (未验证) 提交于 2019-12-02 23:59:01
单例模式:   对于某些应用场景下,某应用在整个系统运行期间,无需创建多份,典型应用如任务管理器,文档编辑工具(Office)。一是不会造成系统资源浪费,二不会出现内容不一致的情况。这样通过单例模式可以保证一致性。   首先单例模式需要保证不能通过new关键字创建对象实例,及控制构造函数私有,然后通过统一的静态方法入口获取单一实例。   单例模式常见的有两种:恶汉式、懒汉式。先看一下饿汉式模式 1、饿汉模式   饿汉模式,即在类加载时就创建对象,代码如下 class EagerSingleton { private static final EagerSingleton instance = new EagerSingleton (); private EagerSingleton () { } public static EagerSingleton getInstance () { return instanct ;} 2、懒汉模式 懒汉模式,即实现“”延迟加载”,对象实例声明为null ,当调用时进行new。代码如下 class LazySingleton { private static LazySingleton instance = null ; private LazySingleton () { } public static LazySingleton

面试必问的并发编程知识点,你知道多少?

匿名 (未验证) 提交于 2019-12-02 23:57:01
前言 众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试的必问题,一个好的Java程序员是必须对并发编程这块有所了解的。 然而不论是哪个国家,什么背景的 Java 开发者,都对自己写的并发程序相当自信,但也会在出问题时表现得很诧异甚至一筹莫展。 可见,Java 并发编程显然不是一件能速成的能力,基础搭得越好,越全面,在实践中才会有更深刻的理解。 因此,大家不难发现 Java 并发问题一直是各个大厂面试的重点之一。我在平时的面试中,也发现很多候选人对一些基本的并发概念表示没听过,或原理不理解,可能知道一些却又讲不清楚,最终导致面试失败。 本文会结合实际中接触到的一些面试题,重点来聊一聊 Java 并发中的相关知识点。 Synchronized 相关问题 问题一:Synchronized 用过吗,其原理是什么? 问题二:你刚才提到获取对象的锁,这个“锁”到底是什么?如何确定对象的锁? 问题三:什么是可重入性,为什么说 Synchronized 是可重入锁? 问题四:JVM 对 Java 的原生锁做了哪些优化? 问题五:为什么说 Synchronized 是非公平锁? 问题六:什么是锁消除和锁粗化? 问题七:为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 问题八:乐观锁一定就是好的吗? 可重入锁 ReentrantLock

浅谈Lock和Synchronized

匿名 (未验证) 提交于 2019-12-02 23:56:01
《一》两则区别(笼统的说一下先): synchronized 是内置Java语言的实现。 synchronized 是发生异常时,会自动地释放线程占有的锁,因此不会导致死锁的现象发生;而lock在发生异常时,如果没有主动通过unlock()去释放锁,则很可能造成死锁现象,因此使用lock时需要在finally中释放锁。 来源:博客园 作者: 离愁i 链接:https://www.cnblogs.com/youdiaodaxue16/p/11432573.html

synchronized的理解

匿名 (未验证) 提交于 2019-12-02 23:49:02
1)当线程尝试获取锁的时候,如果获取不到会一直阻塞。 2)如果持有锁的线程进入阻塞或者休眠时,其他线程尝试获取锁时必须一直等待,除非当前持有锁的线程发生异常。 在Java中每个对象都可以作为锁,主要如下: 先写一段简单的代码: public class Main { public static void main(String[] args) { synchronized (Main.class){ } } } 利用javap命令查看生成class文件来进行synchronized的实现。 javap -v Main.class 查看结果: public class com.entity.Main minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPER Constant pool: #1 = Methodref #3.#22 // java/lang/Object."<init>":()V #2 = Class #23 // com/entity/Main #3 = Class #24 // java/lang/Object #4 = Utf8 <init> #5 = Utf8 ()V #6 = Utf8 Code #7 = Utf8 LineNumberTable #8 = Utf8

Day1备战字节跳动面试

匿名 (未验证) 提交于 2019-12-02 23:43:01
1.重载与重写的区别   重载发生在同一个类中,访问修饰符,返回类型,参数名,参数个数,参数类型,参数顺序,不能完全相同,但是方法名必须相同。   重写发生在不同类中, 存在于继承的关系中,访问修饰符大于父类,如果父类访问修饰符用private修饰,此方法不可被重写,返回类型小于父类,方法名相同,抛出异常小于父类,参数列表必须相同。 2. String 和 、 StringBuilder 的区别是什么? String 为什么是不可变的?   string类中使用final 关键字修饰字符数组来保存字符串,private final value [] ;所以string对象是不可变的。string类不可以被继承,因为该类被final修饰。   而StringBuilder 与 都继承自 AbstractStringBuilder 类, 在 AbstractStringBuilder   String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 的公共父类,定义了一些字符串的基本操作,如   每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。 每次都会对 StirngBuilder 相比使用 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

synchronized 同步

匿名 (未验证) 提交于 2019-12-02 23:43:01
线程安全问题: 多线程同时操作同一份资源的时候,有可能出现线程不安全问题 **作用:**处理线程安全: 同步锁 synchronized(已同步的) 同步方法: 效率较低,简单 同步静态方法 同步成员方法 同步块: synchronized( this || 类名.calss || 资源(成员属性) ){…} 注意: 1.锁一定要 锁不变 的内容 自定义类型对象地址 2.锁的范围太大,效率低,锁的范围太小锁不住 double check 双重检查 效率高,锁的范围小 锁静态方法,锁类的class对象都是锁类,锁住了这个类的所有对象 锁方法 锁this:锁住对象所有的资源(成员属性),如果只想锁住某一个资源,那就可以直接就锁资源 锁资源,效率较高 注意:一定要锁不变的资源内容 转载请标明出处: synchronized 同步 文章来源: https://blog.csdn.net/digua930126/article/details/92004810