synchronized

java并发之hashmap

假装没事ソ 提交于 2020-02-04 07:30:01
在Java开发中经常会使用到hashmap,对于hashmap又了解多少,经常听到的一句话是hashmap是线程不安全的,那为什么是线程不安全的,如何才能保证线程安全,JDK又给我们提供了那些线程安全的类,这些问题是今天讨论的问题, 一、hashmap为什么线程不安全 说到hashmap为什么线程不安全,首先要理解线程安全的定义。简单来讲,指的就是两个以上的线程操作同一个hashmap对象,不会发生资源争抢,hashmap中的数据不会错乱。根据以上的说法,我们大体上看下hashmap的源码,分析下其常用方法put、get的源码。 1、hashmap定义(基于JDK1.8) 经常使用hashmap的方式如下, HashMap map1=new HashMap(); 使用最简单粗暴的方式创建一个HashMap的对象,那么在底层是如何创建的,查看源码如下, /** * Constructs an empty <tt>HashMap</tt> with the default initial capacity * (16) and the default load factor (0.75). */ public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted 根据上面的提示

synchronized原理以及锁优化

左心房为你撑大大i 提交于 2020-02-04 03:46:56
synchronized原理以及锁优化 https://blog.csdn.net/weixin_41563161/article/details/103869694 https://blog.csdn.net/weixin_41563161/article/details/102458297 1 概述 synchronized 是 java 中最常用的保证线程安全的方式,synchronized 的作用主要有三方面: 确保线程互斥的访问代码块,同一时刻只有一个方法可以进入到临界区 保证共享变量的修改能及时可见 有效解决重排序问题 语义上来讲,synchronized主要有三种用法: 修饰普通方法,锁的是当前对象实例(this) 修饰静态方法,锁的是当前 Class 对象(静态方法是属于类,而不是对象) 修饰代码块,锁的是括号里的对象 public class SynTest { private static List<String> list = new ArrayList<String>(); //当前实例的锁 public synchronized void add1(String s){ list.add(s); } //SynTest.class 锁 public static synchronized void add2(String s){ list.add(s);

年初开工,着急跳槽面试题先分享一波,66道大厂面试题来接招

ぃ、小莉子 提交于 2020-02-03 23:11:48
前言: 春招马上就要来了,准备了一些大厂面试题分享给大家,希望可以帮助到大家,不会做的不要急哦文末有答案分享,以及面试宝典pdf分享给大家 1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别? 3、String是最基本的数据类型吗? 4、float f=3.4;是否正确? 5、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗? 6、Java有没有goto? 7、int和Integer有什么区别? 8、&和&&的区别? 9、解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。 10、Math.round(11.5) 等于到大家多少?Math.round(-11.5)等于多少? 11、switch是否能作用在byte上,是否能作用在long上,是否能作用在String上? 12、用最有效率的方法计算2乘以8? 13、数组有没有length()方法?String有没有length()方法? 14、在Java中,如何跳出当前的多重嵌套循环? 15、构造器(constructor)是否可被重写(override)? 16、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

java11_线程的同步

旧巷老猫 提交于 2020-02-03 00:55:28
线程的同步---以三个窗口售票100张为例 (1)问题:卖票的过程出现重票和错票 (2)原因:当某个线程操作车票的过程中,尚未操作完成,其他线程参与进来,也操作车票 (3)解决:当一个线程a在操作共享对象时,其他线程不能参与进来,直到线程a操作完毕,其他 线程才可以开始操作共享对象。 这种情况,即使线程a出现了阻塞,也不能被改变 (4)java中通过同步机制,来解决线程的安全问题: 方式一:同步代码块 synchronized(同步监视器){ //需要被同步的代码(操作共享数据的代码) //共享数据:多个线程共同操作的变量 //不能包含太多,不也能包太少 } 同步监视器----俗称:锁,任何一个类的对象,都可以充当锁 要求:多个线程必须要共用同一把锁,唯一性 补充1:在实现Runnable接口中,使用this做同步监视器 class Window1 implements Runnable { /*只创造了一个Window1对象,因此可以实现100张票共享*/ private int ticket=100; Object ob=new Object();//任何一个类的对象,都可以充当锁 @Override public void run() { while(true){ synchronized(this) {//此时的this:唯一的window1对象,不用在另外创建一个类的对象

BAT一线互联网常考面试题:Spring+并发编程+JVM+设计模式+Redis

情到浓时终转凉″ 提交于 2020-02-02 21:08:43
写在前面 大厂面试主要及经常问到技术点: 并发编程、多线程、JVM、优化、Spring、消息框架、分布式、缓存等以及你使用过的框架且第一轮的基础很重要,通过会后录取可能性就相对高了! 今天小编已经将这些大厂都常问的技术点的问题都整理出来了,希望能帮助到深夜还在为面试做准的朋友、后续准备面试的朋友。 面试题如下: 并发编程28题 Synchronized 用过吗,其原理是什么? 你刚才提到获取对象的锁,这个“锁”到底是什么?如何确定对象的锁? 什么是可重入性,为什么说 Synchronized 是可重入锁? JVM 对 Java 的原生锁做了哪些优化? 为什么说 Synchronized 是非公平锁? 什么是锁消除和锁粗化? 为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有什么特性? 乐观锁一定就是好的吗? 跟 Synchronized 相比,可重入锁 ReentrantLock 其实现原理有什么不同? 那么请谈谈 AQS 框架是怎么回事儿? 请尽可能详尽地对比下 Synchronized 和 ReentrantLock 的异同。 ReentrantLock 是如何实现可重入性的? 除了 ReetrantLock,你还接触过 JUC 中的哪些并发工具? 请谈谈 ReadWriteLock 和 StampedLock。 如何让 Java

Java内存模型与线程(三)

那年仲夏 提交于 2020-02-02 15:35:38
时间记录:202-2-2 上章节主要了解volatile的使用和一些细节部分操作,下面主要为long和double变量的一些特殊规则,还有就是java内存模型的一些特性吧。 long和double变量的一些特殊操作 long和double都是64位的,在java虚拟机中有一条宽松的规定: 允许虚拟机将没有被volatile修饰的64位数据的读写操作划分为两次32位操作来进行 。之前说到对变量的操作的原子性,这样的情况即是允许虚拟机实现选择可以不保证64位数据类型的load,store,read和write着四个操作的原子性,这个就是 非原子性协定 ,那么在多线程读取的情况下就可能会读取到一个半值,这个目前我没碰到过出现这种情况,大部分都认为其实原子的。注意下这个问题就可以了,以后如果遇到要想起。 java内存模型的特性 之前已经了解java内存模型中的变量的访问规则,然后其主要是围绕的 原子性 , 可见性 , 有序性 来建立的。 一:原子性 由java内存模型直接保证的原子性变量操作包括read,load,assign,use,store,write,我们大致可以认为基本数据类型的访问读写是具备原子性的(double,long除外,但是这种基本上不会发生的情况,我们不去考虑了)。我们常说的原子操作,就是说一个操作过程中是独立的,不会受到外面的干扰,在java中也提供了字节指令

201771010123汪慧和《面向对象程序设计Java》第十七周实验总结

送分小仙女□ 提交于 2020-02-01 13:30:51
一、理论部分 1、多线程并发执行中的问题 ◆多个线程相对执行的顺序是不确定的。 ◆线程执行顺序的不确定性会产生执行结果的不确定性。 ◆在多线程对共享数据操作时常常会产生这种不确定性。 2、 线程的同步 -多线程并发运行不确定性问题解决方案:引入线程同步机制,使得另一线程要使用该方法,就只能等待。 - 在Java中解决多线程同步问题的方法有两种: - Java SE 5.0中引入ReentrantLock类 - 在共享内存的类方法前加synchronized修饰符。 …… public synchronized static void sub(int m) …… (1)解决方案一:锁对象与条件对象 用ReentrantLock保护代码块的基本结构如下: myLock.lock(); try { critical section } finally { myLock.unlock(); } 有关锁对象和条件对象的关键要点: ➢ 锁用来保护代码片段,保证任何时刻只能有一个线程执行被保护的代码。 ➢ 锁管理试图进入被保护代码段的线程。 ➢ 锁可拥有一个或多个相关条件对象。 ➢ 每个条件对象管理那些已经进入被保护的代码段但还不能运行的线程。 (2)解决方案二: synchronized关键字 synchronized关键字作用: ➢某个类内方法用synchronized 修饰后

马凯军201771010116《面向对象与程序设计Java》第十七周学习总结

删除回忆录丶 提交于 2020-02-01 13:30:19
一.理论知识部分 Java 的线程调度采用优先级策略:优先级高的先执行,优先级低的后执行;多线程系统会自动为每个线程分配一个优先级,缺省时,继承其父类的优先级; 任务紧急的线程,其优先级较高; 同优先级的线程按“先进先出”的队列原则。 调用setPriority(int a)重置当前线程的优先级,a取值可以是前述的三个静态量。调用getPriority()获得当前线程优先级。 多线程并发运行不确定性问题解决方案:引入线程同步机制,使得另一线程要使用该方法,就只能等待。 在Java中解决多线程同步问题的方法有两种:J ava SE 5.0中引入ReentrantLock类。 在共享内存的类方法前加synchronized修饰符。 有关锁对象和条件对象的关键要点:锁用来保护代码片段,保证任何时刻只能有一个线程执行被保护的代码。锁管理试图进入被保护代码段的线程。锁可拥有一个或多个相关条件对象。每个条件对象管理那些已经进入被保护的代码 段但还不能运行的线程。 synchronized关键字作用: 某个类内方法用synchronized 修饰后,该方法被称为同步方法;只要某个线程正在访问同步方法,其他线程欲要访问同步方法就被阻塞,直至线程从同 步方法返回前唤醒被阻塞线程,其他线程方可能进入同步方法。 在同步方法中使用wait()、notify 和notifyAll()方法

狄慧201771010104《面向对象程序设计(java)》第十七周学习总结

ぐ巨炮叔叔 提交于 2020-02-01 13:29:42
一.理论知识部分 Java 的线程调度采用优先级策略:优先级高的先执行,优先级低的后执行;多线程系统会自动为每个线程分配一个优先级,缺省时,继承其父类的优先级; 任务紧急的线程,其优先级较高; 同优先级的线程按“先进先出”的队列原则。 调用setPriority(int a)重置当前线程的优先级,a取值可以是前述的三个静态量。调用getPriority()获得当前线程优先级。 多线程并发运行不确定性问题解决方案:引入线程同步机制,使得另一线程要使用该方法,就只能等待。 在Java中解决多线程同步问题的方法有两种:J ava SE 5.0中引入ReentrantLock类。 在共享内存的类方法前加synchronized修饰符。 有关锁对象和条件对象的关键要点:锁用来保护代码片段,保证任何时刻只能有一个线程执行被保护的代码。锁管理试图进入被保护代码段的线程。锁可拥有一个或多个相关条件对象。每个条件对象管理那些已经进入被保护的代码 段但还不能运行的线程。 synchronized关键字作用: 某个类内方法用synchronized 修饰后,该方法被称为同步方法;只要某个线程正在访问同步方法,其他线程欲要访问同步方法就被阻塞,直至线程从同 步方法返回前唤醒被阻塞线程,其他线程方可能进入同步方法。 在同步方法中使用wait()、notify 和notifyAll()方法

Collections.synchronizedList 、CopyOnWriteArrayList、Vector介绍、源码浅析与性能对比【文末福利】

痞子三分冷 提交于 2020-02-01 09:25:05
ArrayList线程安全问题 众所周知, ArrayList 不是线程安全的,在并发场景使用 ArrayList 可能会导致add内容为null,迭代时并发修改list内容抛 ConcurrentModificationException 异常等问题。java类库里面提供了以下三个轮子可以实现线程安全的List,它们是 Vector Collections.synchronizedList CopyOnWriteArrayList 本文简要的分析了下它们线程安全的实现机制并对它们的读,写,迭代性能进行了对比。 Vector 从JDK1.0开始, Vector 便存在JDK中, Vector 是一个线程安全的列表,底层采用数组实现。其线程安全的实现方式非常粗暴: Vector 大部分方法和 ArrayList 都是相同的,只是加上了 synchronized 关键字,这种方式严重影响效率,因此,不再推荐使用 Vector 了。JAVA官方文档中这样描述: If a thread-safe implementation is not needed, it is recommended to use ArrayList in place of Vector. 如果不需要线程安全性,推荐使用ArrayList替代Vector 关键源码如下: public synchronized