synchronized

Synchronized block in the main method

心不动则不痛 提交于 2019-12-06 14:12:20
问题 In the below code about the synchronisation between threads, according to the output generated why is the control being transferred to the execution of the new thread despite the lock being acquired for the same object "dt" in the main method ? public class DemoThread extends Thread { public DemoThread() { } public void run() { int i=0; synchronized(this) { while(++i<=5) { sum=i; try{ sleep(1000); System.out.println("Woke up from sleep"); if(i>=2) this.notify(); }catch(InterruptedException ie

26 多线程(六)——线程安全 synchronized

北城余情 提交于 2019-12-06 14:00:58
关键字synchronized可以写在方法和代码块中 写在普通方法中:锁住的对象时this 写在静态方法中:锁住的对象时class 写在代码块中 关于这个synchronized关键字 线程锁会造成性能下降 线程锁用在大的方法中,很影响性能 关于线程锁 除了使用synchronized关键字外,还可以使用另一种线程锁,本文没有收录方法 下面来看一个没有加线程锁的案例:3个线程抢票 package _20191205; /** * 线程不安全: * @author TEDU */ public class SynTest01 { public static void main(String[] args) { //一份资源 SafeWeb12306 web = new SafeWeb12306(); new Thread(web,"线程1").start(); new Thread(web,"线程2").start(); new Thread(web,"线程3").start(); } } class SafeWeb12306 implements Runnable{ //票数 private int ticketNums = 100; private boolean flag = true; @Override public void run() { while(flag) {

How to wait till require finished in dojo

♀尐吖头ヾ 提交于 2019-12-06 14:00:33
问题 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><

“金九银十”已过,总结我的天猫、蚂蚁、头条面试经历(Java岗)

此生再无相见时 提交于 2019-12-06 12:29:18
跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己的发展,偏移自己规划的轨迹),还是钱给少了,不受重视。 准备不充分的面试,完全是浪费时间,更是对自己的不负责(如果title很高,当我没说)。 今天给大家分享我在这次“金九银十”期间跳槽面试的几个大厂经历,总结了这次跳槽中整理的Java面试合集,其中大部分都是这次面试过程中的面试题,可以对照这查漏补缺。 天猫 天猫一面(55分钟) 自我介绍 HashMap实现原理,ConcurrentHashMap实现原理 红黑树,为什么允许局部不平衡 TCP,UDP区别,为什么可靠和不可靠 一次HTTP请求的全过程,包括域名解析、定位主机等 TCP三次握手 MySQL事务是什么?四大特性,四大隔离级别 ConcurrentHashMap和Hashtable区别 spring IOC和AOP,以及各有什么优点 有哪几种常用的线程池 什么情况下使用Runnable和Thread创建线程,Runnable和Callable的区别 线程方法中的异常如何处理,副线程可以捕获到吗 synchronized和锁的区别,什么情况下使用synchronized和ReentrantLock JVM的对象分配在哪个区

从JVM内存模型谈线程安全

牧云@^-^@ 提交于 2019-12-06 12:14:27
作为一个三个多月没有去工作的独立开发者而言,今天去小米面试了一把.怎么说呢,无论你水平如何,请确保在面试之前要做准备,就像其中一位面试官说的一样,我知道你水平不错,但是无论如何也是要准备下的,不然你怎么会连这个方法也忘记了? 此刻,我突然觉得我是一个假程序员.为什么这么说呢,作为一个从12年就开始写代码的程序员来说,忘记某个方法太可耻了.等赶明写一篇文章就叫做"我是个假程序员"来谈谈这些有趣的事儿. 话不多说,今天要谈的主题是相对较深,较广,但我努力的让他看起来清晰明了. 存储器层次结构 对于开发者来说,存储器的层次结构应该是非常熟悉的,大体如下: 这里写图片描述 其中寄存器,L1,L2,L3都被封装在CPU芯片中,作为应用开发者而言我们很少去注意和使用它.之所以引入L1,L2,L3高速寄存器,其根本是为了解决访问运算器和内存速度不匹配.但缓存的引入也带来两个问题: 缓存命中率:缓存的数据都是主存中数据的备份,如果指令所需要的数据恰好在缓存中,我们就说缓存命中,反之,需要从主存中获取.一个好的缓存策略应该尽可能的提高命中率,如何提高却是一件非常困难的事情. 缓存一致性问题:我们知道缓存是主存数据的备份,但每个核心都有自己的缓存,当缓存中的数据和内存中的数据不一致时,应该以谁的数据为准呢,这就是所谓缓存一致性问题. 上面只是展示存储器的层次结构

1.5 synchronized其他概念

六月ゝ 毕业季﹏ 提交于 2019-12-06 11:42:11
synchronized 锁重入 : 关键字synchronized拥有锁重入的功能,也就是使用synchronized时,当一个线程得到了一个对象的锁后,再次请求此对象时是可以再次得到对象的锁. 输出结果: method1方法加了synchronized了,在method1()方法中调用加synchronized的method2()方法是完全没有问题的. =================================================================================================================================== 例二: 通过此例反映出: 有父子继承关系的时候,如果都加synchronized修饰了,以下这种调用也是线程安全的 ================================================================================================================================ 碰到异常示例:(就是加锁方法在执行过程中如果出现异常,那么锁就立马释放了,其他在外面等的线程就直接 进来了)   说明:对于web应用程序,异常释放锁的情况,如果不及时处理

Java synchronized block using method call to get synch object

懵懂的女人 提交于 2019-12-06 11:30:54
问题 We are writing some locking code and have run into a peculiar question. We use a ConcurrentHashMap for fetching instances of Object that we lock on. So our synchronized blocks look like this synchronized(locks.get(key)) { ... } We have overridden the get method of ConcurrentHashMap to make it always return a new object if it did not contain one for the key. @Override public Object get(Object key) { Object o = super.get(key); if (null == o) { Object no = new Object(); o = putIfAbsent((K) key,

Java多线程学习(七)

旧街凉风 提交于 2019-12-06 10:55:36
等待/通知模式中最经典的案例当属生产者/消费者模式,此模式有几种变形,但都是基于wait/notify的。 生产者/消费者模式有两种类型:操作值的和操作栈的。下面分别从这两方面来讲解生产者/消费者模式。 操作值 ①一生产与一消费 public class P { private String lock; //操作值 public P(String lock){ this.lock = lock; } public void setValue(){ synchronized(lock){ if(!ValueObject.value.equals("")){ lock.wait(); } String value = System.currentTimeMillis(); ValueObject.value = value; lock.notify(); } } } public class C { private String lock; //操作值 public C(String lock){ this.lock = lock; } public void getValue(){ synchronized(lock){ if(ValueObject.value.equals("")){ lock.wait(); } ValueObject.value = ""; lock

全面理解Java内存模型

不羁岁月 提交于 2019-12-06 10:44:53
------------恢复内容开始------------ 1. java内存模型即java Memory Model,简称JMM.JMM定义了Java虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。 2.并发编程有两个关键问题: 线程之间的通信和同步 。 3.线程之间的 通信 机制有两种: 共享内存和消息传递 。 1)在 共享内存 的并发模型里,线程之间共享程序的公共状态,线程之间通过写读内存中的公共状态来 隐式 进行通信,典型的共享内存通信方式就是通过共享对象进行通信。 2)在 消息传递 的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来 显式 进行通信,在Java中典型的消息传递方式是wait()和notify() 4.线程之间的 同步 是指程序用于控制不同线程之间操作发生相对顺序的机制。 1)在 共享内存 并发模型里,同步是 显式 进行的。必须显式指定某个方法或某段代码需要在线程之间互斥执行。 2)在 消息传递 的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是 隐式 进行的。 5.Java的并发采用的是 共享内存模型 ,即Java内存模型(简称JMM), JMM决定一个线程对共享变量的写入合适对另一个线程可见 。从抽象的角度来看, JMM定义了线程和主内存之间的抽象关系

多个线程多个锁

走远了吗. 提交于 2019-12-06 10:31:11
多个线程多个锁:多个线程,每个线程都可以拿到自己指定的锁,分别获得锁之后,执行synchronized方法体的内容 (1).不加static关键字执行结果 运行结果: (2).加上static关键字执行的结果 加static的意思是:在静态方法上 加上synchronized修饰的话,(以后获得的锁)以后这个线程调用printNum()方法时, 类级别的锁.无论以后自己实例化出多少个对象,都是没有任何关联关系的 加sttaic修饰了表示类级别的锁,无论有多少个对象,都可以保证同步. ============================================================================================================= 总结:   关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁,所以示例代码中哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock),两个对象,线程获得的就是两个不同的锁,他们互不影响.   有一种情况则是相同的锁,即在静态方法上加上synchronized关键字,表示锁定.class类,类级别的锁(独占.class类).无论有多少个对象,都可以保证同步. 来源: https://www.cnblogs.com