synchronized

2018-2-24 牛客试题复盘

和自甴很熟 提交于 2020-02-24 14:18:00
1、使用mvc模式设计的web应用程序具有以下优点,除了? D A、可维护行强 B、可扩展性强 C、代码重复少 D、大大减少代码量 2、关于依赖注入,下列选项中说法错误的是(B) A、依赖注入能够独立开发各组件,然后根据组件间关系进行组装 B、依赖注入使组件之间相互依赖,相互制约 C、依赖注入提供使用接口编程 D、依赖注入指对象在使用时动态注入 解析: 依赖注入的动机就是减少组件之间的耦合度,使开发更为简洁。 3、下列说法正确的是( C) A、volatile,synchronized 都可以修改变量,方法以及代码块 B、volatile,synchronized 在多线程中都会存在阻塞问题 C、volatile能保证数据的可见性,但不能完全保证数据的原子性,synchronized即保证了数据的可见性也保证了原子性 D、volatile解决的是变量在多个线程之间的可见性、原子性,而sychroized解决的是多个线程之间访问资源的同步性 解析: synchronized关键字和volatile关键字比较: volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关键字要好。但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。synchronized关键字在JavaSE1

并发编程三要素:原子性,有序性,可见性

跟風遠走 提交于 2020-02-24 10:46:50
并发编程三要素 原子性: 一个不可再被分割的颗粒。原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。 有序性: 程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序) 可见性: 一个县城对共享变量的修改,另一个线程能够立刻看到。 一、原子性 线程切换会带来原子性的问题 int i = 1; // 原子操作 i++; // 非原子操作,从主内存读取 i 到线程工作内存,进行 +1,再把 i 写到主内存。 虽然读取和写入都是原子操作,但合起来就不属于原子操作,我们又叫这种为“复合操作”。 我们可以用synchronized 或 Lock 来把这个复合操作“变成”原子操作。 例子: //使用synchronized private synchronized void increase(){ i++; } //使用Lock private int i = 0; Lock mLock = new ReentrantLock(); private void increase() { mLock.lock(); try { i++; } finally{ mLock.unlock(); } } 这样我们就可以把这个一个方法看做一个整体,一个不可分割的整体。 除此之前,我们还可以用java.util.concurrent.atomic里的原子变量类

java 单例模式

随声附和 提交于 2020-02-24 10:42:25
1. 单例模式 (1)概念 单例模式的定义是:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 (2)类图、代码 单例模式的类图设计如下: 单例模式中的主动实例化(加载类时实例化单例类)[推荐使用]: //主动实例化的单例模式--饿汉式单例 public class Singleton { // 自行实例化一个对象 private static final Singleton singleton = new Singleton(); // 私有构造函数,只允许自行实例化对象 private Singleton() { } // 公开唯一对象的调用方法,供外部调用 public static Singleton getInstance() { return singleton; } } 外部通过代码Singleton singleton = Singleton.getInstance();来调用这个实例。 该方法的优点是:能保证 线程安全 (适用于单、多线程)。 该方法的缺点是:在加载类时实例化导致该static对象一直保存在内存中, 无论是否使用都占着内存空间 。( 饿汉式”的由来:不管你用的用不上,一开始就建立这个单例对象 ) 单例模式中的被动实例化(调用方法时实例化单例类): //被动实例化的单例模式--懒汉式单例 public class Singleton

201521123019 《Java程序设计》第11周学习总结

风格不统一 提交于 2020-02-24 08:18:16
1. 本章学习总结 2. 书面作业 Q1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步访问(请出现相关代码)? class Account{ private int balance; private Lock poolLock = new ReentrantLock(); private Condition condition = poolLock.newCondition(); public Account(int balance) { super(); this.balance = balance; } public int getBalance() { return balance; } public void deposit(int money){ poolLock.lock(); try{ this.balance=getBalance() + money; condition.signal(); } finally { poolLock.unlock(); } } public void withdraw(int money){ poolLock.lock(); try{ while (getBalance() <money) { try {

synchronized 与 volatile

爷,独闯天下 提交于 2020-02-24 07:47:35
synchronized 与 volatile: 可见性 :一个线程对共享变量的修改,能够及时的被其他线程看到 所有的变量都储存在主内存中,每个线程独有自己独立的工作内存,里面保存着主内存中该变量的拷贝副本 线程对共享变量的操作都必须在自己的工作内存中进行不能直接在主内存中读写。不同线程中的变量值需要通过主内存传递。 Synchronized :可以实现原子性(同步)、可见性。线程解锁前必须把共享变量的最新值刷新到主内存中。加锁时会清空工作内存中共享变量的值,从而使用共享变量时会重新从主内存中读取最新变量值(加锁解锁需要是同一把锁)。 重排序:代码书写顺序与实际执行顺序不一致 是编译器或者处理器为提高程序执行性能而做的优化 共享变量线程间不可见原因:重排序、线程交叉执行、共享变量值更新后没有在工作内存和主内存间及时更新 Synchronized 加到方法上时默认使用当前对象锁。方法一旦执行,就会独占该锁,一直到从该方法返回时或者出现异常时 jvm才将锁释放,此后被阻塞的线程方能获得该锁,从而重新进入可执行状态。 运行结果多运行几次会发现 如果不加synchronized 多个线程会存在交叉运行如:002、022或者线程的先后顺序会变化如002、222。 加了synchronized后虽然线程的先后顺序会变化但会一直到从该方法返回。 Volitale

Java并发编程(三)概念介绍

狂风中的少年 提交于 2020-02-23 16:28:26
在构建稳健的并发程序时,必须正确使用线程和锁。但是这终归只是一些机制。要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对 共享的(Shared) 和 可变的(Mutable) 状态的访问。 对象的状态是指存储在 状态 变量(例如实例或静态域)中的数据。 对象的状态可能包括其他 依赖对象的域 。比如某个HashMap的状态不仅是HashMap对象本身,还存储在许多Map.Entry对象中。 "共享"意味着变量可以由多个线程同时访问,而"可变"则意味着变量的值在其生命周期内可以变化。 线程安全性在于如何防止数据上发生 不可控的并发访问 。 一个对象是否 需要是线程安全的 ,取决于它是否被多个线程访问。 要使对象是线程安全的,需要采用 同步机制 来协同对对象可变状态的访问。如果无法实现协同,那么可能导致数据破坏以及其他不该出现的结果。 协同多个线程对变量访问的同步机制主要有: 1. 关键字 synchronized 2. 关键字 volatile 3. 显式锁 (Explicit Lock) 4. 原子变量 协同多线程访问一个可变的状态变量的方法有: 1. 不在线程之间共享该状态变量 2. 将状态变量修改为不可变的变量 3. 在访问状态变量时使用同步 什么是线程安全? 一个类在多线程环境下被访问,这个类始终能表现出正确的行为,那么就称这个类是线程安全的。

synchronized与Lock的区别

喜夏-厌秋 提交于 2020-02-23 00:56:03
1,synchronized属于jvm层面的,带有Synchronized语句块的class文件可以看到在同步代码块的起始位置插入了moniterenter指令,在同步代码块结束的位置插入了monitorexit指令。wait和notify只能在同步代码块和同步方法中使用。 Lock是java.util.concurrent.locks包下的,属于api层面的。 2,是否可以释放锁 synchronized不需要手动去释放锁,当synchroniz代码块执行完自动释放锁。 ReentrantLock则需要手动去释放锁,如果不释放则会产生死锁现象。lock()与unlock()要结合try/catch/finally来使用。 3,是否可以中断 synchronized不可以中断,要不异常退出要不正常运行完退出 ReentrantLock可中断,设置超时时间等 4,是否是公平锁 synchronized非公平锁 ReentrantLock默认非公平锁,构造方法传入true为公平锁,false为非公平锁。 5,锁绑定多个条件 synchronized要么唤醒一个要不全部唤醒 ReentrantLock可以实现精确唤醒 来源: CSDN 作者: 一位IT女 链接: https://blog.csdn.net/weixin_44774355/article/details/104449846

设计模式——单例模式

大城市里の小女人 提交于 2020-02-22 22:29:46
单例模式 什么是单例模式? 单例模式指,采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类肢体东一个取得其对象实例的方法(静态方法) e.g. : Hibernate中的Session Factory。 它否则创建Session对象,一个项目通常只需要一个SessionFactory就够。 饿汉式——静态常量 构造器私有化(使用 private, 防止 new) 类的内部创建实例对象,用final 和 static 关键词修饰 向外暴露一个静态的公共方法 (getInstance) //饿汉式(静态常量) class Singleton { //1. 构造器私有化,外部不能new private Singleton(){} //2. 本类内部创建对象实例 private final static Singleton instance = new Singleton(); //3. 对外提供一个公有的静态方法,返回实例对象 public static Singleton getInstance() { return instance; } } 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。 优点 写法简单,在类装载的时候就完成实例化。避免了线程同步问题

12、java5锁java.util.concurrent.locks.Lock之ReentrantLock

会有一股神秘感。 提交于 2020-02-22 12:58:29
JDK文档描述: public interface LockLock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象。 锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问。一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁。不过,某些锁可能允许对共享资源并发访问,如 ReadWriteLock 的读取锁。 synchronized 方法或语句的使用提供了对与每个对象相关的隐式监视器锁的访问,但却强制所有锁获取和释放均要出现在一个块结构中:当获取了多个锁时,它们必须以相反的顺序释放,且必须在与所有锁被获取时相同的词法范围内释放所有锁。 虽然 synchronized 方法和语句的范围机制使得使用监视器锁编程方便了很多,而且还帮助避免了很多涉及到锁的常见编程错误,但有时也需要以更为灵活的方式使用锁。例如,某些遍历并发访问的数据结果的算法要求使用 "hand-over-hand" 或 "chain locking":获取节点 A 的锁,然后再获取节点 B 的锁,然后释放 A 并获取 C,然后释放 B 并获取 D,依此类推。Lock 接口的实现允许锁在不同的作用范围内获取和释放,并允许以任何顺序获取和释放多个锁

@synchronized的用法

主宰稳场 提交于 2020-02-22 01:50:27
@synchronized 的作用是创建一个互斥锁,保证此时没有其它线程对self对象进行修改。这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其它线程访问,起到线程的保护作用。 一般在公用变量的时候使用,如单例模式或者操作类的static变量中使用。 大概就是如果线程A访问一对象时,线程B必须等线程A访问完毕后,线程B才能够去操作。@synchronized(id anObject)是最简单的方法,会自动对参数对象加锁,保证临界区内的代码线程安全。 来源: https://www.cnblogs.com/wuyang-li/p/5606521.html