synchronized

java synchronized 关键字详解

末鹿安然 提交于 2019-12-10 02:47:26
Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍然可以访问该object中的非加锁代码块。 一、synchronized同步方法 1.synchronized 同步方法,为对象锁 public class ExceptionReleaseLock { public synchronized void testLockException(){ if (Thread.currentThread().getName().equals("A")){ System.out.println("线程名字为:"+Thread.currentThread().getName()+" 开始运行时间:"+System.currentTimeMillis()); for(int i=0;i<200;i++){ while(i>20){ System.out.println("i="+i); Integer.parseInt("abcd"); } } }else{ System.out.println

正确使用 Volatile 变量

落爺英雄遲暮 提交于 2019-12-10 02:28:30
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized ”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。 锁提供了两种主要特性: 互斥(mutual exclusion) 和 可见性(visibility) 。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。 Volatile 变量 Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器

ThreadLocal与Synchronized

穿精又带淫゛_ 提交于 2019-12-10 00:04:49
ThreadLocal使用场合主要解决多线程中数据数据因并发产生不一致问题。ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,单大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。 ThreadLocal和Synchonized都用于解决多线程并发访问。但是ThreadLocal与synchronized有本质的区 别。synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本, 使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通 信时能够获得数据共享。 Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。 ThreadLocal类详解请查看 http://www.cnblogs.com/dolphin0520/p/3920407.html ThreadLocal类实例请查看 http://blog.csdn.net/yemaozi2009/article/details/39212167 来源: oschina 链接: https://my.oschina.net/u/2000675/blog

Java synchronized关键字详解

北慕城南 提交于 2019-12-10 00:04:27
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。 三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。 四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。 五、以上规则对其它对象锁同样适用. 举例说明: 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 package

Synchronized详解

此生再无相见时 提交于 2019-12-09 23:47:26
一、使用零长度的byte[]对象作为锁 class Foo implements Runnable { private byte[] lock = new byte[0]; // 特殊的instance变量 Public void methodA() { synchronized(lock) { //… } } //….. } 注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。 二、synchronized作用范围 1、只对对象生效,不对类生效 public synchronized void test1(){ while ( i <= 5 ){ try { Thread. sleep ( 1000L ); } catch (InterruptedException e) { e.printStackTrace(); } System. out .println(Thread. currentThread ().getName()+ ":print-" + i ); i ++; } public void test(){ synchronized ( this ){ while ( i <= 5 ){ try { Thread. sleep

JAVA基础篇

試著忘記壹切 提交于 2019-12-09 22:59:17
Day27 03:如果一个方法为重写父类的方法(如实现一个接口的实现类方法) 方法内部的异常不能抛 只能try catch。 多线程共用同一资源时会发生安全隐患问题。 04:解决线程安全问题的方法:同步技术(synchronized):结构:synchronized(任意对象){线程要操作的共享数据} 这个大括号括起来的部分就叫做 :同步代码块。 05:synchronized(任意对象){线程要操作的共享数据}中的任意对象 (obj object的new对象)其实就是对象监视器 同步代码块的原理就是 线程进入代码块之前判断obj是否在(即线程同步判断 锁是否在),如果锁在(即obj在大门口)那么就获取锁 然后这个线程离开代码块的时候 还要释放锁(即把锁还给obj obj重新看门去) 所以同步代码块导致运行速度下降。 07:非静态方法中的同步对象锁 synchronized(this) 不需要再创建obj。 因为返回值为synchronized时 这个锁就已经是this了(this指的是本类对象的引用)。 静态方法中的同步锁 其实就是synchronized(本类名.class)。但是无论静态不静态 同步不同步 都是有锁的。 08:lock接口改进了synchronized lock更广泛。 09:lock.lock()获取锁 lock.unlock()释放锁

图解 java线程安全

和自甴很熟 提交于 2019-12-09 21:18:36
什么是线程 线程安全 Java内存模型 - JMM 什么是 JMM 线程安全的本质 线程同步 Synchronized 关键字 Synchronized 作用 Volatile 关键字 Volatile 作用 java.util.concurrent.atomic Lock 详情参考 作者:七彩祥云至尊宝 https://juejin.im/post/5d2c97bff265da1bc552954b 来源: CSDN 作者: 轩辕朗 链接: https://blog.csdn.net/weixin_45805060/article/details/103464148

synchronized和volatile使用

为君一笑 提交于 2019-12-09 20:28:46
synchronized和volatile volatile :保证内存可见性,但是不保证原子性; synchronized:同步锁,既能保证内存可见性,又能保证原子性; synchronized实现可重入锁 (1.持有同一锁自动获取 2.继承锁) 锁定的对象有两种:1.类的实例(对象锁) 2.类对象(类锁) 对象锁(synchronized修饰普通方法或代码块) 对象锁已被其他调用者占用,则需要等待此锁被释放 /** * 对象锁的两种方式 */ //方式一 private int count =10; public synchronized void test01() { count--; System.out.println(Thread.currentThread().getName()+"count="+count); } //方式二 public void test02() { synchronized(this) { count--; System.out.println(Thread.currentThread().getName()+"count="+count); } } 类锁(synchronized修饰静态方法) 所有类实例化对象互斥拥有一把类锁 private static int count =10; /** * 类锁两种表现方式 */ public

好程序员分享大数据教程之线程高级部分

别说谁变了你拦得住时间么 提交于 2019-12-09 17:37:04
好程序员分享大数据教程之线程高级部分,首先讲一下线程的生命周期 对于一个线程, 在被创建后, 不是立即就进入到了运行状态, 也不是一直处于运行状态, 在线程的声明周期中, 一个线程会在多种状态之间进行切换 new : 新生状态, 线程被实例化, 但是还没有开始执行(start) runnable: 就绪状态, 已经执行过start, 线程已经启动了, 只是没有抢到CPU时间片 running: 运行状态, 抢到了CPU时间片 blocked: 阻塞状态, 线程执行的过程中, 遇到一些特殊情况, 会进入阻塞状态. 阻塞中的线程, 是不能参数时间片的抢夺的 (不能被线程调度器调度) dead: 死亡状态, 线程终止 ​ 正常死亡 : run方法中的代码执行结束 ​ 非正常死亡 : 强制使用stop方法停止这个线程 临界资源问题 由于线程之间是资源共享的。如果有多个线程,同时对一个数据进行操作,此时这个数据会出现问题。 如果有一个线程在访问一个临界资源,在访问之前,先对这个资源“上锁”,此时如果有其他的线程也需要访问这个临界资源,需要先查这个资源有没有被上锁,如果没有被上锁,此时这个线程可以访问这个资源;如果上锁了,则此时这个线程进入阻塞状态,等待解锁。 同步代码段 // 同步代码段 // 小括号:就是锁 // 大括号:同步代码段,一般情况下,写需要对临界资源进行的操作

多线程

大兔子大兔子 提交于 2019-12-09 12:16:51
我们在之前,学习的程序在没有跳转语句的前提下,都是由上至下依次执行,那现在想要设计一个程序,边打游戏 边听歌,怎么设计? 要解决上述问题,咱们得使用多进程或者多线程来解决。 并发与并行 并发 :指两个或多个事件在 同 一 个时间段内 发生。 并行 :指两个或多个事件在 同 一 时刻 发生(同时发生)。 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单 CPU 系统中,每 一时刻只能有一道程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那是因为分时交替运行的时间是非常短的。 而在多个 CPU 系统中,则这些可以并发执行的程序便可以分配到多个处理器上( CPU ),实现多任务并行执行,即利用每个处理器来处理一个可以并发执行的程序,这样多个程序便可以同时执行。目前电脑市场上说的多核 CPU,便是多核处理器,核 越多,并行处理的程序越多,能大大的提高电脑运行的效率。 注意:单核处理器的计算机肯定是不能并行的处理多个任务的,只能是多个任务在单个 CPU 上并发运行。同理, 线程也是一 样的,从宏观角度上理解线程是并行运行的,但是从微观角度上分析却是串行运行的,即一个 线程一个线程的去运行,当系统只有一个CPU 时,线程会以某种顺序执行多个线程,我们把这种情况称之为 线程调度。 线程与进程 进程 :是指一个内存中运行的应用程序