synchronized

Java并发编程--2.synchronized

六眼飞鱼酱① 提交于 2020-03-01 03:14:54
前言 synchronized关键字是互斥锁,也称为内部锁 每个对象都有自己的monitor(锁标记),它是为了分配给线程,最多一个线程可以拥有对象的锁 使用 synchronized修饰成员方法,锁的是当前实例对象 下面是一个例子: class Thread2 implements Runnable{ private int count; //修饰成员方法,锁的是调用它的对象,该例中也即是调用它的线程 public synchronized void run() { for (int i = 0; i < 5; i ++) { try { System.out.println(Thread.currentThread().getName() + ":" + (count++)); Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } 调用: Thread2 t2 = new Thread2(); new Thread(t2).start(); new Thread(t2).start(); synchronized修饰静态方法,锁的是该类的Class对象 下面是一个例子: class Thread3 implements Runnable { private

Java Thread系列(五)synchronized

南笙酒味 提交于 2020-03-01 03:14:28
Java Thread系列(五)synchronized 本文我们讨论 synchronized 重量级锁的实现原理。 一、synchronized 实现原理 1.1 synchronized 修饰符对应的字节码指令 我们知道在 java中synchronized 主要有两种使用形式:同步方法和同步代码块。 synchronized 可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。Java 中每一个对象都可以作为锁,这是 synchronized 实现同步的基础: (1)普通同步方法,锁是当前实例对象 (2)静态同步方法,锁是当前类的class对象 (3)同步方法块,锁是括号里面的对象接下来 public class SynchronizedTest { // 作用于类级别 public synchronized static void testClass() { System.out.println("synchronized testClass!!!"); } // 作用于方法级别 public synchronized void testMethod() { System.out.println("synchronized testMethod!!!"); } // 作用于代码块级别 public void

synchronized细节问题(二)

橙三吉。 提交于 2020-03-01 03:12:07
使用synchronized声明的方法在某些情况下是有弊端的,比如A线程调用同步的方法执行一个很长时间的任务,那么B线程就必须等待比较长的时间才能执行,这样的情况下,可以使用synchronized代码块去优化代码执行时间,也就是通常所说的减小锁的粒度。 synchronized可以使用任意的Object进行加锁,用法比较灵活。 另外特别注意一个问题,就是不要使用String的常量加锁,会出现死循环问题。 锁对象的改变问题,当使用一个对象进行加锁的时候,要注意对象本身发生改变的时候,那么持有的锁就不同。如果对象本身不发生改变,那么依然是同步的,即使是对象的属性发生了变化: demo: public class ModifyLock { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public synchronized void changeAttributte(String name, int

Java多线程之synchronized(一)

落花浮王杯 提交于 2020-03-01 03:11:17
在上节中已经说过了“非线程安全”是如何出现的,链接如下:http://www.cnblogs.com/chentong/p/5650137.html,那么怎么解决“非线程安全”问题呢,只需要在两个线程都需要同时访问的方法前面加上synchronized关键字即可,我只贴出需要修改的这个方法的代码,具体修改如下: public static class GetNum { private int num = 0; //两个线程访问同一个对象中的同步方法时一定是线程安全的 synchronized public void getNum(String name) { try { if ("a".equals(name)) { num = 100; System.out.println("a set over"); Thread.sleep(2000); } else { num = 200; System.out.println("b set over"); } System.out.println("线程" + name + "的num=" + num); } catch (Exception e) { e.printStackTrace(); } } }    结果如下:无论哪个线程先执行,一定不会出现交叉执行的情况,因为synchronized取得是对象锁

Java多线程学习(二)synchronized关键字(1)

时间秒杀一切 提交于 2020-03-01 03:10:17
转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二) 将分为两篇文章介绍 synchronized同步方法 另一篇介绍 synchronized同步语句块 。 系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多线程学习(四)等待/通知(wait/notify)机制 系列文章将被优先更新与微信公众号 “Java面试通关手册” ,欢迎广大Java程序员和爱好技术的人员关注。 (1) synchronized同步方法 本节思维导图: 思维导图源文件+思维导图软件关注微信公众号: “Java面试通关手册” 回复关键字: “Java多线程” 免费领取。 一 简介 Java并发编程这个领域中 synchronized关键字 一直都是元老级的角色,很久之前很多人都会称它为 “重量级锁” 。但是,在JavaSE 1.6之后进行了主要包括为了 减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁 以及其它各种优化之后变得在某些情况下并不是那么重了。

Java多线程学习(三)

为君一笑 提交于 2020-03-01 01:43:56
用关键字synchronized声明方法是有弊端的。 synchronized同步代码块的使用:当两个并发线程访问桶一个对象object中的synchronized(this)同步代码块是,一段时间内只能有一个线程被执行,另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 synchronized(this){ } 当一个线程访问object的一个synchronized同步代码块时,另一个线程仍然可以访问该object对象中的非synchronized(this)同步代码块。因此可以较同步方法提高效率。 object对象中的代码,不在synchronized块中就是异步执行,在synchronized块中就是同步执行。 synchronized代码块之间的同步性:在使用synchronized(this)同步代码块时需要注意的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对同一个object中所有其他synchronized(this)同步代码块的访问将被阻塞,这说明synchronized使用的对象监视器是同一个。必须等待当前synchronized(this)同步代码块执行完之后,才能访问其他的synchronized(this)同步代码块。 同synchronized方法一样,synchronized(this

《java并发编程的艺术》二 java并发机制的底层实现原理

帅比萌擦擦* 提交于 2020-02-29 21:53:59
一、volatile的应用 volatile的定义与实现原理 volatile的两条实现原则: (1)Lock前缀指令会引起处理器缓存回写到内存。 (2)一个处理器的缓存回写到内存会导致其他处理器的缓存无效。 如果通过嗅探一个处理器来检测其他处理器打算写内存地址,而这个地址当前处于共享状态,那么正在嗅探的处理器将使它的缓存行无效,在下次访问相同内存地址时,强制执行缓存行填充。 二、synchronized的实现原理与应用 java中的每一个对象都可以作为锁,具体表现为以下3种形式: (1)对于普通同步方法,锁的是当前实例对象。 (2)对于静态同步方法, 锁的是当前类的Class对象。 (3)对于同步方法块,锁的是synchronized括号里配置的对象。 1. java对象头 synchronized用的锁是存在java对象头里的。java对象头里的Mark word里默认存储对象的Hashcode、分代年龄和锁标志位。 在运行期间,Mark word里存储的数据会随着锁标志位的变化而变化。 2. 锁的升级与对比 java中的锁一共有四种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,这几个状态会随着竞争情况逐渐升级,锁可以升级但不能降级,这种策略,目的是为了提高获得锁和释放锁的效率。 2.1 偏向锁 经过研究发现,大多数情况下,锁不仅不存在多线程竞争

Java自学-多线程 死锁

不想你离开。 提交于 2020-02-29 20:21:32
Java 演示多线程死锁 当业务比较复杂,多线程应用里有可能会发生 死锁 步骤 1 : 演示死锁 线程1 首先占有对象1,接着试图占有对象2 线程2 首先占有对象2,接着试图占有对象1 线程1 等待线程2释放对象2 与此同时,线程2等待线程1释放对象1 这样就会。。。一直等待下去 package multiplethread; import charactor.Hero; public class TestThread { public static void main(String[] args) { final Hero ahri = new Hero(); ahri.name = "九尾妖狐"; final Hero annie = new Hero(); annie.name = "安妮"; Thread t1 = new Thread(){ public void run(){ //占有九尾妖狐 synchronized (ahri) { System.out.println("t1 已占有九尾妖狐"); try { //停顿1000毫秒,另一个线程有足够的时间占有安妮 Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e

Java基础(九)

给你一囗甜甜゛ 提交于 2020-02-29 18:09:58
一、总述 多线程程序在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务。通常,每一个任务称为一个线程,它是线程控制的简称。可以同时运行一个以上线程的程序称为多线程程序。 多进程与多线程的区别:每个进程拥有自己的一整套变量,而线程则共享数据。 二、中断线程 interrupt方法可以用来请求终止线程。当对一个线程调用interrupt方法时,线程的中断状态将被置位。这是每一个线程都具有的boolean标志。 三、线程状态 线程可以有如下六种状态:(要确定一个线程的当前状态,可调用getState方法) 1、New(新创建):当一个线程处于新创建状态时,程序还没有开始运行线程中的代码。 2、Runnable(可运行):在任何给定时刻,一个可运行的线程可能正在运行也可能没有运行。 3、Blocked(被阻塞):当一个线程试图获取一个内部的对象锁,而该锁被其他线程持有,则该线程进入阻塞状态。当所有其他线程释放该锁,并且线程调度器允许本线程持有它的时候,则该线程将变成非阻塞状态。 4、Waiting(等待):当线程等待另一个线程通知调度器一个条件时,它自己进入等待状态。 5、Timed Waiteing(计时等待):有几个方法有一个超时参数。调用它们导致线程进入计时等待状态。这一状态将一直保持到超时期满或者接收到适当的通知。 6、Terminated(被终止):线程被终止的原因有两个

JAVA多线程_线程安全问题

不想你离开。 提交于 2020-02-29 17:28:16
当多条语句(线程)在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误。这样就是线程的安全问题。 解决线程安全的方式有两种: 1.synchronized同步机制 2.Lock锁 一、synchronized同步机制 1.同步代码块 同步代码块的意思就是将需要操作的共享数据的代码段用synchronized同步执行 synchronized (对象){ // 需要被同步的代码; } 2.同步方法 synchronized可以放在方法声明中,表示整个方法为同步方法。 public synchronized void show (String name){ …. } 可以将此方法放入需要多线程执行的run()方法中调用 二、Lock锁 从JDK 5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当。 锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象。 class A{ private final ReentrantLock lock = new ReenTrantLock(); public void main(){ lock.lock(); try{ //保证线程安全的代码; }finally{