线程阻塞

并发编程相关面试题四

倖福魔咒の 提交于 2020-03-28 12:34:17
一、Java开发中用过哪些锁 1、乐观锁   乐观锁顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS(Compare and Swap 比较并交换)实现的   乐观锁适合读操作非常多的场景,不加锁会带来大量的性能提升;     乐观锁在Java中的使用,是无锁编程,常常采用的是CAS算法,典型的例子就是原子类,通过CAS自旋实现原子操作的更新。 2、悲观锁   悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。比如Java里面的同步原语synchronized关键字的实现就是悲观锁。   悲观锁适合写操作非常多的场景;   悲观锁在Java中的使用,就是利用各种锁; 3、独享锁   独享锁是指该锁一次只能被一个线程所持有。   独享锁通过AQS来实现的,通过实现不同的方法,来实现独享锁。   对于Synchronized而言,当然是独享锁。 4、共享锁   共享锁是指该锁可被多个线程所持有。  

java线程中断Interrupted用法

你离开我真会死。 提交于 2020-03-28 08:18:03
停止一个线程的主要机制是中断,中断并不代表强迫终止一个线程, 它是一种协作机制,是给线程传递一个取消的信号, 但是让线程来决定如何以及何时退出。 这句话可谓是线程中断的核心原理了;光看文字还是很模糊的,用代码说事吧。 1 public class ThreadEnd implements Runnable { 2 3 private volatile static boolean ok=false; 4 @Override 5 public void run() { 6 for(;;){ 7 if(Thread.currentThread().isInterrupted()){ 8 System.out.println("我进入了中断线程的条件中,将要结束run方法"); 9 break;//因为是for死循环,用这种方式退出循环 10 }else{ 11 System.out.println("我没有收到中断信息"); 12 } 13 } 14 } 15 16 17 18 public static void main(String[] args) throws InterruptedException { 19 Thread thread = new Thread(new ThreadEnd()); 20 thread.start(); 21 Thread.sleep(1000

java synchronized 线程同步机制详解

ⅰ亾dé卋堺 提交于 2020-03-28 07:27:50
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。 三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。 四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。 五、以上规则对其它对象锁同样适用. 1.同步代码块,使用的锁可以是任意对象,但是操作共享资源时,锁必须唯一! 2.同步函数,使用的锁是this! 好处:解决线程的安全问题 缺点:都会判断同步锁,降低效率,同步函数设置在run函数上,会被某个线程一直占用

Java关键字synchronized详解

偶尔善良 提交于 2020-03-28 07:21:04
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 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。   在 Java 中

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 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 中,不光是类实例, 每一个类也对应一把锁

notify 和 notifyAll 的区别

筅森魡賤 提交于 2020-03-28 06:33:19
(一)先看一个 notify发生死锁的例子: http://blog.csdn.net/tayanxunhua/article/details/20998449 (本文虽是转载,不过也加入了一些个人观点) JVM多个线程间的通信是通过 线程的锁、条件语句、以及wait()、notify()/notifyAll组成。 下面来实现一个启用多个线程来循环的输出两个不同的语句: package com.tyxh.block; class OutTurn { private boolean isSub = true ; private int count = 0; public synchronized void sub() { try { while (! isSub ) { this .wait(); } System. out .println( "sub ---- " + count ); isSub = false ; this .notify(); } catch (Exception e) { e.printStackTrace(); } count ++; } public synchronized void main() { try { while ( isSub ) { this .wait(); } System. out .println( "main (((((((