synchronized

synchronized到底锁住的是谁?

∥☆過路亽.° 提交于 2019-12-02 08:29:55
题目:利用5个线程并发执行,num数字累计计数到10000,并打印。 1 /** 2 * Description: 3 * 利用5个线程并发执行,num数字累加计数到10000,并打印。 4 * 2019-06-13 5 * Created with OKevin. 6 */ 7 public class Count { 8 private int num = 0; 9 10 public static void main(String[] args) throws InterruptedException { 11 Count count = new Count(); 12 13 Thread thread1 = new Thread(count.new MyThread()); 14 Thread thread2 = new Thread(count.new MyThread()); 15 Thread thread3 = new Thread(count.new MyThread()); 16 Thread thread4 = new Thread(count.new MyThread()); 17 Thread thread5 = new Thread(count.new MyThread()); 18 thread1.start(); 19 thread2.start()

java并发(一)wait,notify的使用

旧时模样 提交于 2019-12-02 08:21:54
Java是第一个内置对多线程支持的主流编程语言。在Java5之前,对多线程的支持主要是通过对块结构的同步实现的(synchronized配合wait,notify,notifyAll),Java5引入了java.util.concurrent包,提供了对多线程编程的更高层的支持。 在Java中,除了int等基本类型之外,一切皆为对象。synchronized关键字以及Object类中的wait,notify和notifyAll方法为我们编写多线程程序提供了原始的支持。 例如: public class A { public synchronized void fun() { ... } } 在调用方法fun之前,调用该方法的执行线程必须要先获得类A的实例(a)的对象锁。上面的方法fun在功能上等同于: public void fun() { synchronized(this) { ... } } 在执行fun之前,要获取a的对象锁,在方法fun返回之前,要释放a的对象锁。 通常可以使用synchronized和notify,notifyAll以及wait方法来实现线程之间的数据传递及控制。对于对象obj来说: obj.wait():该方法的调用,使得调用该方法的执行线程(T1)放弃obj的对象锁并阻塞,直到别的线程调用了obj的notifyAll方法

Java锁相关及synchronized关键字

与世无争的帅哥 提交于 2019-12-02 08:17:10
Java中锁的概念 自旋锁:为了不放弃CPU执行时间,循环的使用CAS技术对数据进行尝试更新,直至成功。 悲观锁:假定会发生并发冲突,同步所有共享数据的相关操作,从读书据就开始上锁。 乐观锁:假定没有冲突,在修改数据时如果发现数据和之前获取的不一致,则读取最新数据,然后重试修改。 独享锁(写):给资源加上写锁,线程可以修改资源,其它线程不能再加锁;(单写) 共享锁(读):给资源加上读锁后只能读不能改,其他线程也只能加读锁,不能加写锁;(多读) 可重入锁、不可重入锁:线程拿到一把锁之后,可以自由进入同一把锁同步的其他代码,则为可重入锁;否则是不可重入锁。 公平锁、非公平锁:争抢锁的顺序,如果是按先来后到,则为公平锁;否则是非公平锁。 Java中几种重要的锁的实现方式:synchronized、ReentrantLock、ReentrantReadWriteLock 同步关键字synchronized 属于最基本的线程通信机制,基于对象监视器实现的。 Java中的每个对象都与一个监视器相关联,一个线程可以锁定或解锁监视器。 一次只有一个线程可以锁定监视器。 试图锁定该监视器的其他线程都会被阻塞,直到他们可以获得该监视器上的锁定为止。 特性:可重入、独享锁、悲观锁 锁的范围:类锁、对象锁 JVM优化:锁消除、锁粗化 提示:同步关键字,不仅是实现同步,根据JVM规范还能保证可见性

synchronizing by this vs dummy object

陌路散爱 提交于 2019-12-02 07:26:07
I have seen usage of synchronized block by this so far but recently I learned that using dummy object is preferable. I found the following topic related to this. Java synchronized method lock on object, or method? As a summary, in the code below, two different object can not run addA and addB concurrently as both uses this for lock. private int a; private int b; public synchronized void addA(){ a++; } public synchronized void addB(){ b++; } I am confused if I use dummy object for lock, what will be different if I use the line below in both method to synchronize? Because still they would have

谈谈你对多线程同步机制的理解?

风流意气都作罢 提交于 2019-12-02 06:40:09
线程同步是为了确保线程安全,所谓线程安全指的是多个线程对同一资源进行访问时,有可能产生数据不一致问题,导致线程访问的资源并不是安全的。 ( 如果多线程程序运行结果和单线程运行的结果是一样的,且相关变量的值与预期值一样,则是线程安全的。 ) java中与线程同步有关的关键字/类包括: volatile、synchronized、Lock、AtomicInteger等concurrent包下的原子类。。。等 线程安全 概述:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。 注: 这意味着如若要实现线程安全,代码本身必须要封装所有必要的正确性保障手段(比如锁的实现),以确保程序无论在多线程环境下如何调用该方法,将始终保持返回正确的结果。 Java的线程安全 我们在讨论Java的线程安全,实际上讨论的是“相对线程安全”。需要保证的是单独对象操作是线程安全的,调用过程中不需要额外的保障措施,但是涉及到某些业务场景需要特定顺序连续调用,就可能需要调用者考虑使用额外的同步手段保证同步。 例如使用 : synchronized Java中与线程同步有关的关键词/类: 1. Synchronized 同步原理 :

多线程-synchronized

心已入冬 提交于 2019-12-02 06:20:38
线程安全和 synchronized 进程和线程 进程:运行一个程序就是一个进程,进程是线程的容器 线程:程序执行流的最小单元,单个程序中同时运行多个线程完成不同的工作就是多线程。 异步和同步 异步:无需等待其他调用者的完成,可以继续往下执行 同步:需等待其他调用者完成,才能继续往下执行 并行和并发 并发:两个任务在执行的时候,时间上没有重叠,两个任务是交替执行,由于切换很快,对于外界调用者来说相当于同一时刻多个任务一起执行了。 并行:两个任务在时间上有重叠,并行才是真正意义上的同一时刻可以多个任务同时执行。 线程安全 当多个线程访问操作同一个共享资源时候就会发生线程安全性问题。 保证线程安全就需要采用加锁机制。 当一个线程访问该类的某个数据时进行保护,其它线程不能进行访问,直到该线程读取完,释放锁,其它线程才可以使用。常见加锁:synchronized。 synchronized (1) 可以在任意对象及方法上加锁,而加锁的这段代码称之为互斥区和临界区。 使用synchronized修饰的方法,多线程就会以排队的方式进行处理。一个线程想要执行synchronized修饰的方法里的代码,首先是尝试获得锁,如果拿到锁,执行synchronized代码体的内容;如果拿不到锁的话,这个线程就会不断的尝试获得这把锁,直到拿到为止,而且多个线程同时去竞争这把锁,也就是会出现竞争的问题。 (2

分享一下自己的秋招历程

落花浮王杯 提交于 2019-12-02 06:19:19
前言 今天是1024程序员节,博主是2020届硕士,就在前几天刚刚结束了2019年的秋招,借此机会分享一下秋招的一些历程和心得。 秋招情况 先总体介绍一下秋招的情况,岗位是java后端,大概是投了 30多家公司,简历挂掉的只有陌陌一家,还有几个投了一直在筛选,笔试挂掉的有360,网易,拼多多(太菜了拼多多笔试了三次都没过),远景智能(这个有个英语测评,我得了个最低分估计是这个给我挂了),还有来学校的几个猫眼,绿盟,金山云等,大部分笔试还是都过了的。面试的20多家拿到了五家的offer,按时间顺序来有映客直播,华为,阅文集团(腾讯文学),瓜子二手车,百度。博主最后选择是百度,AT和其他大厂基本上都没投,一方面毕业在即另一方面自己准备也不算太充分,拿到了百度就选择结束秋招了。 备战秋招过程 下面讲一下自己准备的过程,说起秋招准备,我是属于那种起了个大早干了个晚集的那种。我是在18年年底在算法和开发纠结了一番,最后选择了开发。然后19年年初就开始准备了,因为本身有java基础,所以直接从javaweb开始看的,先看了一些jsp,servlet,session,html,js等相关的基础知识,并跟着视频做了个简单的商城项目。春节过后,先是在实验室忙了一些毕设相关的事情,然后又做了一些其他的工作,业余时间我刷了两遍剑指offer,到了五一那会儿,我开始决定做一个SSM的商城项目xx商城

Java并发编程基本知识

最后都变了- 提交于 2019-12-02 05:51:55
目录 并发基础 并发编程的原则 Runnable和Thread synchronized关键字 volatile关键字 join()方法 CountDownLatch对象 wait()、notify()和notifyAll() ReentrantLock锁 Java中的同步容器 线程池 Executor接口 ExecutorService Executors工具类 Future Callable接口 ThreadPoolExecutor创建线程池 FixedThreadPool线程池 CachedThreadPool线程池 ScheduledThreadPool线程池 SingleThreadExecutor线程池 ForkJoinPool线程池 线程组 并发基础 并发编程的原则 1. 原子性 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 2. 可见性 对于可见性,Java提供了volatile关键字来保证可见性。当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时

volatile和synchronized区别

你。 提交于 2019-12-02 05:47:27
volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用synchronized所带来的庞大开销,倘若能恰当的合理的使用volatile,自然是美事一桩。 为了能比较清晰彻底的理解volatile,我们一步一步来分析。首先来看看如下代码 public class TestVolatile { boolean status = false; /** * 状态切换为true */ public void changeStatus(){ status = true; } /** * 若状态为true,则running。 */ public void run(String t){ if(status){ System.out.println("running...." + t); } } } 上面这个例子,在多线程环境里,假设线程A执行changeStatus()方法后,线程B运行run()方法,可以保证输出"running....."吗?   答案是NO!   这个结论会让人有些疑惑,可以理解。因为倘若在单线程模型里,先运行changeStatus方法,再执行run方法,自然是可以正确输出"running...."的;但是在多线程模型中

Why aren't the calls in main sequential?

北城余情 提交于 2019-12-02 05:33:17
问题 I was going through some simple examples on threading/synchronizing from a book that claims the use of synchronized will allow access to the method by one thread being called on the same instance. It does serialize as promised but it seems that about 9/10 times the third Caller created in the Synch main method below comes before the second. This code is the example code showing the issues without a synchronized method. class CallMe { void call(String msg) { System.out.print("[" + msg); try {