synchronized

java多线程学习笔记(六)

北城以北 提交于 2019-12-05 03:06:01
本节开始synchronized关键字的最后一部分内容: 静态同步方法synchronized方法与synchronized(class)代码块 关键字synchronized还可以用在static静态方法上,如果这样写,相当于对当前的*.java文件对应的Class类进行持锁。 结论写在前面:synchronized加到静态方法上和加到非静态方法上表面上的使用效果是一样的,但本质效果不同,synchronized关键字加到static静态方法上是给Class类加锁,而synchronized关键字加到非静态方法上是给对象加锁,两者不是同一个锁,所以同时使用的时候,当两个线程分表调用两种方法时,会出现异步的效果; 同步synchronized(class)代码块的作用其实是和synchronized static方法的作用是一样的 来源: https://www.cnblogs.com/samanian/p/11900820.html

Java中的锁

别来无恙 提交于 2019-12-05 02:55:31
一、乐观锁   乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据时都认为别人不会修改,所以不会上锁,但是在更新时会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写操作。   Java中的乐观锁基本是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。 二、悲观锁   悲观锁就是悲观思想,即认为写多,遇到并发写的可能性高,每次去拿数据时都认为被人会修改,所以每次在读写数据时都会上锁。这样别人想读写这个数据就会block知道拿到锁。Java中的悲观所就是Synchronized,AQS框架下的锁则是先尝试CAS乐观锁去获取锁,若获取不到时,才会转换为悲观锁,如RetreenLock。 三、Synchronized同步锁 可以把任意一个非null的对象当作锁,它属于独占式的悲观锁,同时属于可重入锁。 作用范围:   1)作用于方法时,锁住的是对象的实例(this);   2)作用于静态方法时,锁住的是Class实例,又因为Class的相关数据存储在永久代PermGen(JDK1.8则是metaspace),永久代是全局共享的,因此静态方法相当于类的一个全局锁,会锁所有调用该方法的线程。   3

Java多线程面试题

醉酒当歌 提交于 2019-12-05 02:22:31
   1、启动一个线程是调用run()方法还是start()方法?      启动一个线程是调用start()方法,是线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行,这并不意味着线程就会立即执行   2、请说出同步线程及线程调度相关的方法?     wait():是一个线程等待(阻塞bolcked)状态,并且释放所持有的对象的锁     sleep():是一个正在运行状态的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;     notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关。     notifyAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得了锁的线程才能进入就绪状态。     注意:Java5通过Lock接口提供了 显式的锁机制 ,Lock接口中定义了加锁(lock()方法)和解锁(unlock()方法),增强了多线程编程的灵活性及对线程的协调。???    3、线程和进程的区别?     进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位。     线程:是进程的一个实体

Synchronized方法锁、对象锁、类锁区别

自作多情 提交于 2019-12-05 02:17:50
synchronized,这个东西我们一般称之为”同步锁“,他在修饰代码块的时候需要传入一个引用对象作为“锁”的对象。 1. 在修饰方法的时候,默认是当前对象作为锁的对象 2. 在修饰类时,默认是当前类的Class对象作为所的对象 3. 故存在着方法锁、对象锁、类锁 这样的概念    那么我们来大致看一下这三种锁 方法锁(synchronized修饰方法时)     通过在方法声明中加入synchronized关键字来声明synchronized方法。   synchronized 方法锁控制对类成员变量的访问:   每个类实例对应一把锁   每个synchronized方法都必须获得调用该方法的类实例的”锁“方能执行,否则所属线程阻塞。   方法一旦执行,就会独占该锁,一直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,从而重新进入可执行状态。   这种机制确保了同一时刻对于每一个类的实例,其所有声明为synchronized的成员函数中之多只有一个处于可执行状态,从而有效避免了类成员变量的访问冲突。   ok,下方介绍一个火车站卖票的例子,一共1000张票,有4个窗口卖票,卖票的方法被我定义为同步的,即每个卖票过程会卖出4张票,卖完之后才允许其他窗口卖票   大家看看代码,体会一下   下边我们来看下对象锁,其实方法锁 这个就属于对象锁 对象锁

Synchronized release order

我怕爱的太早我们不能终老 提交于 2019-12-05 01:06:46
I scanned all the java documentation on the synchronized statements looking for an answer to this question with no luck. Say I have thread1 , thread2 , thread3 trying to run the following code all at the same time. synchronized(lockObj) { doSomething(); } Assume thread1 gets first to doSomething() , thread2 then thread3 which will block and wait on the synchronized statement. Question When thread1 releases the lock, which of the threads will be released first? What is the general order rule that applies when releasing a lock? 1. Either thread2 or thread3. There is no guarantee: Likewise, no

Why `this.synchronized` instead of just `synchronized` in Scala?

百般思念 提交于 2019-12-04 23:49:34
In an example of working with JDBC in Scala, there is a following code: this.synchronized { if (!driverLoaded) loadDriver() } Why this.synchronized instead of just synchronized ? In scala synchronized is not a keyword, as in java. It is in fact a member of AnyRef , which is scala equivalent for java's Object . So to answer your question, you can either use synchronized or this.synchronized , just as you can do toString or this.toString . 来源: https://stackoverflow.com/questions/7826822/why-this-synchronized-instead-of-just-synchronized-in-scala

Two threads executing two `synchronized` methods?

ぐ巨炮叔叔 提交于 2019-12-04 22:00:19
I was reading about JAVA synchronization. I have 2 methods in my class. public synchronized void eat() { System.out.println("eat"); eatDinner(); } public synchronized void eatDinner() { System.out.println("eat"); } Both of my methods are synchronized. Now Is it possible for 2 threads one is calling eat() and another eatDinner() to run simultaneously? And If thread2 has not still executing eatDinner() . Can thread1 can call eatDinner() from eat() ? No , it is not possible for two threads to run the methods eat and eatDinner simultaneously. (Caveat: as long as these methods are invoked on the

多线程之美1一volatile

假装没事ソ 提交于 2019-12-04 21:12:28
摘自: https://www.cnblogs.com/flydashpig/p/11875652.html 多线程之美1一volatile 目录 一、java内存模型 1.1、抽象结构图 1.2、概念介绍 二、volatile详解 2.1、概念 2.2、保证内存可见性 2.3、不保证原子性 2.4、有序性 一、java内存模型 1.1、抽象结构图 1.2、概念介绍 java 内存模型 即Java memory model(简称JMM), java线程之间的通信由JMM控制,决定一个线程对共享变量的写入何时对另一个线程可见。 多线程通信通常分为2类:共享内存和消息传递 JMM采用的就是共享内存来实现线程间的通信,且通信是隐式的,对程序开发人员是透明的,所以在了解其原理了,才会对线程之间通信,同步,内存可见性问题有进一步认识,避免开发中出错。 线程之间如何通信? 在java中多个线程之间要想通信,如上图所示,每个线程在需要操作某个共享变量时,会将该主内存中这个共享变量拷贝一份副本存在在自己的本地内存(也叫工作内存,这里只是JMM的一个抽象概念,即将其笼统看做一片内存区域,用于每个线程存放变量,实际涉及到缓存,寄存器和其他硬件),线程操作这个副本,比如 int i = 1;一个线程想要进行 i++操作,会先将变量 i =1 的值先拷贝到自己本地内存操作,完成 i++,结果 i=2

java synchronized 探究

浪子不回头ぞ 提交于 2019-12-04 20:18:45
java synchronized关键字是并发编程最常用的工具,也是最重要的工具之一。今天来探究下其含义 写两个类,两段不同的临界区代码进行测试。 有以下4种测试方案,每种方案对应4种不同的锁类型:对象锁: synchronized(this),本类锁: synchronized(Me.class),父类锁: synchronized(Parent.class),自定义锁对象   1. 同一个对象,在不同线程中运行   2. 同一个类的不同对象,在不同线程中运行   3. 不同类(有共同的父类)的不同对象,在不同线程中运行   4. 不同类(没有共同的父类)的不同对象,在不同线程中运行 测试结果:   用对象锁,只有1可以互斥访问临界区;   用本类锁,则1和2可以互斥访问临界区;   用共同父类的锁,全部都可以互斥访问临界区。(注意,使用第4种测试方案时,两个对象已经没有共同的父类了,因此这个所谓共同父类的锁,其实是一个第3者,与这两个类没有直接关系,类似于自定义的锁对象,只不过这个自定的锁对象不是普通的对象,而是一个Class对象)   用自定义的锁对象,全部都可以互斥访问临界区。 /** * synchronized关键字测试 * * @author zhangxz * @date 2019-11-18 11:07 */ public class

How to wait till require finished in dojo

試著忘記壹切 提交于 2019-12-04 20:16:48
I'm providing an infrastructure for other developers, and i'm using Dojo for it. In my Init function i'm using the 'require' method (of course) which one of the parameters are the callback function when all the modules have been loaded. The problem is that the client don't want to use callbacks. He wants to call me and line after to use me (to make my Init method synchronized) - and give him the code back after we for sure finished loading our modules. My Code <script src=..../dojo.js></script> function Init() { var loaded = false; require(["...myFiles..."], function() { loaded = true; }); //