synchronized

Synchronized关键字整理

对着背影说爱祢 提交于 2020-03-28 07:00:17
Synchronized关键字整理 作用:能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全效果。 两个用法: 1 、对象锁: 包括 方法锁 ( 默认锁对象为this当前实例对象 )和 同步代码块锁 ( 自己指定锁对象 )。 2 、类锁: 指synchronized修饰 静态 的方法或指定锁为 Class对象。 概念: l 只有一个Class对象:Java类可能有多个java对象,但只有一个Class对象。 l 本质:所谓的类锁,不过是Class对象锁而已。 l 用法和效果:类锁只能在同一时刻被一个对象拥有。 性质: 可重入 : l 概念: 指同一线程的外层函数获得锁之后,内层函数可以直接再次获取该锁 l 好处:避免死锁、提升封装性。 l 粒度: 是线程范围 而非调用范围。 l 原理:加锁次数计数器。线程第一次给对象加锁时,设为1,。每当该线程在此对象上再次获得锁时,计数递增。当任务离开时,计数递减,为0时,完全释放锁。 不可中断 缺陷: l 效率低:锁的释放情况少、试图获得锁时不能设定超时、不能中断一个正在试图获得锁的线程。 l 不够灵活(读写锁更灵活):加锁和释放的时机单一,每个锁仅有单一的条件(某个对象),可能是不够的。 l 无法知道是否成功获取到锁。 多线程访问同步方法的7种情况: 两个线程同时访问一个对象的同步方法。(同步)

Java多线程(二) synchronized 针对对象进行锁定

会有一股神秘感。 提交于 2020-03-28 06:59:57
http://www.cnblogs.com/QQParadise/articles/5059824.html 1.方法内的变量为线程安全的 2.实例变量非线程安全的 public class HasSelfPrivateNum { private int num = 0; synchronized public void addI(String username) { try { if (username.equals("a")) { System.out.println("a set over"); num = 100; Thread.sleep(2000); }else{ num =200; System.out.println("b set over"); } System.out.println(username+" num="+num); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ThreadA public class ThreadA extends Thread{ private HasSelfPrivateNum numRef; public ThreadA(HasSelfPrivateNum numRef){

java 多线程之:synchronized

只愿长相守 提交于 2020-03-28 06:53:33
synchronized原理 在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。 当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。例如,synchronized(obj)就获取了“obj这个对象”的同步锁。 不同线程对同步锁的访问是互斥的。也就是说,某时间点,对象的同步锁只能被一个线程获取到!通过同步锁,我们就能在多线程中,实现对“对象/方法”的互斥访问。 例如,现在有两个线程A和线程B,它们都会访问“对象obj的同步锁”。假设,在某一时刻,线程A获取到“obj的同步锁”并在执行一些操作;而此时,线程B也企图获取“obj的同步锁” —— 线程B会获取失败,它必须等待,直到线程A释放了“该对象的同步锁”之后线程B才能获取到“obj的同步锁”从而才可以运行。 synchronized基本规则 我们将synchronized的基本规则总结为下面3条,并通过实例对它们进行说明。 第一条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的该“synchronized方法”或者“synchronized代码块”的访问将被阻塞。 第二条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程仍然可以访问“该对象

java多线程实现卖票程序(synchronized)

♀尐吖头ヾ 提交于 2020-03-28 06:52:22
本文采用java多线程实现了模拟车站多个车票卖票的功能。 关键词:java多线程 并发 共享资源 互斥访问 实现runnable接口 volatile 线程同步。 关键:线程同步,因为创建了多个线程,那么卖票部分代码应该上锁来保证线程对此关键代码的互斥访问,上锁的方式有两种,一种是synchronized隐式锁,另一种是Lock.lock()显式锁。 问题1:两种锁的区别:使用显示锁可以做到更细的控制粒度。比如可以设置一个线程试图获取锁,但是设定时间内获取锁失败可以进行其他操作等,这些事synchronized锁无法实现的。 问题2:synchronized作用讲解 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。 三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。 四、第三个例子同样适用其它同步代码块

Java线程的同步 - synchronized

*爱你&永不变心* 提交于 2020-03-28 06:50:34
为什么要在线程里面使用同步 - synchronized 首先看个列子: 假设系统里面有5张票,有个卖票的系统,执行完,打印的结果是这样的: public class RunDemo05 implements Runnable { private int count = 5; public void run() { for(int i=0;i<10;i++) { sale(); } } public void sale(){ if (count>0) { try{ Thread.sleep(1000); } catch(Exception e){ e.printStackTrace(); } System.out.println(count--); } } public static void main(String[] args) { RunDemo05 r = new RunDemo05(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); Thread t3 = new Thread(r); t1.start(); t2.start(); t3.start(); } } 结果: 5 3 4 2 1 2 出现这样的原因: 在同一时刻有多个线程访问count数据,所以导致这种结果。

Java Keyword Synchronized 学习记录

你离开我真会死。 提交于 2020-03-28 06:44:39
Synchronized Java编程思想:每个对象都包含了一把锁(也叫作“监视器”),它自动成为对象的一部分,调用任何synchronized方法时,对象就会被锁定,不可再调用那个对象的其他任何synchronized 方法,除非第一个方法完成了自己的工作,并解除锁定。 特点:Jvm层面,非公平,悲观,独占,可重入,重量级。 作用:修饰方法和代码块。 修饰方法和代码块 synchronized修饰静态方法,我们可以称其为“类锁”,即只要有一个线程实例对象获取该锁,其他线程实例对象都需要等待。修饰非静态方法,我们称之为对象锁,即不同的线程实例对象是可以调用同一类下的同步方法。 /** * @PackageName com.a.squirrel.synchronize * @Author: squirrel * @Date: 2018/6/25 10:04 * @Description: synchronized解析辅助类 */ public class SynchronizedDescription { private String tmpStr; private int tmpInt; /** * @Author squirrel * @Description 非静态同步方法 * @Date 2018/6/25 * @Param [synchronizedDescription]

Java关键字synchronized详解

為{幸葍}努か 提交于 2020-03-28 06:35:50
Java关键字synchronized详解 博客分类: Java综合 Java 多线程 thread 互联网 制造 synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行 它包括两种用法:synchronized 方法和 synchronized 块。 1. synchronized 方法:   通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:   public synchronized void accessVal(int newVal);   synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突

Java关键字synchronized详解

≡放荡痞女 提交于 2020-03-28 06:35:20
synchronized 关键字 , 代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行 它包括两种用法:synchronized 方法和 synchronized 块。 1. synchronized 方法:   通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如: public synchronized void accessVal(int newVal);   synchronized方法控制对类成员变量的访问: 每个类实例对应一把锁 ,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。   在 Java 中,不光是类实例, 每一个类也对应一把锁

Java 多线程总结

限于喜欢 提交于 2020-03-28 06:29:36
昨天熬了个通宵,看了一晚上的视频,把java 的多线程相关技术重新复习了一遍,下面对学习过程中遇到的知识点进行下总结。 首先我们先来了解一下进程、线程、并发执行的概念:   进程是指: 一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。 线程是指: 进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。 一般来说, 当运行一个应用程序的时候,就启动了一个进程,当然有些会启动多个进程。启动进程的时候,操作系统会为进程分配资源,其中最主要的资源是内存空间,因为程序是在内存中运行的。 在进程中,有些程序流程块是可以乱序执行的,并且这个代码块可以同时被多次执行。实际上,这样的代码块就是线程体。线程是进程中乱序执行的代码流程。当多个线程同时运行的时候,这样的执行模式成为并发执行。 线程的状态 1、线程共有下面4种状态: 新建状态(New): 新创建了一个线程对象,当你用new创建一个线程时,该线程尚未运行。 就绪状态(Runnable): 线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。 运行状态(Running):

Java关键字-synchronized

时光毁灭记忆、已成空白 提交于 2020-03-28 03:08:43
synchronized 关键字的三种使用方式   修饰实例方法,作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁。   修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 。也就是给当前类加锁,会作用于类的所有对象实例,因为静态成员不属于任何一个实例对象,是类成员( static 表明这是该类的一个静态资源,不管new了多少个对象,只有一份,所以对该类的所有对象都加了锁)。所以如果一个线程A调用一个实例对象的非静态 synchronized 方法,而线程B需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,因为访问静态 synchronized 方法占用的锁是当前类的锁,而访问非静态 synchronized 方法占用的锁是当前实例对象锁。   修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。 和 synchronized 方法一样,synchronized(this)代码块也是锁定当前对象的。synchronized 关键字加到 static 静态方法和 synchronized(class)代码块上都是是给 Class 类上锁。需要注意的是:尽量不要使用 synchronized(String a) 因为JVM中,字符串常量池具有缓冲功能! synchronized