Java线程及进程
文章平均质量分 88
sun cat
只有让自己变得更优秀,才无所畏惧
展开
-
谈谈你对多线程同步机制的理解?
线程同步是为了确保线程安全,所谓线程安全指的是多个线程对同一资源进行访问时,有可能产生数据不一致问题,导致线程访问的资源并不是安全的。(如果多线程程序运行结果和单线程运行的结果是一样的,且相关变量的值与预期值一样,则是线程安全的。)java中与线程同步有关的关键字/类包括:volatile、synchronized、Lock、AtomicInteger等concurrent包下的原子类。。...原创 2019-10-24 20:40:35 · 1291 阅读 · 0 评论 -
多线程有什么要注意的问题?
并发问题,安全问题,效率问题。原创 2019-10-23 20:42:55 · 616 阅读 · 0 评论 -
多线程同步机制
在需要同步的方法的方法签名中加上 synchronized关键字 使用synchronized关键字对需要进行同步的代码块进行同步 使用java.util.concurrent.lock包中Lock对象(JDK1.8)...原创 2019-10-23 20:40:57 · 221 阅读 · 1 评论 -
谈谈对多线程的理解
用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。基本知识:(1)多线程:指的是这个程序(一个进程)运行时产生了不止一个线程(2)并行与并发:1)并行:...原创 2019-10-23 20:36:13 · 1709 阅读 · 0 评论 -
什么是线程池,如何使用?
一、为什么用线程池1、创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率例如:记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3如果T1+T3>T2,那么是不是说开启一个线程来执行这个任务太不划算了!正好,线程池缓存线程,可用已有的闲置线程来执行新任务,避免了T1+T3带来的系统开销2、线程并发数量过多,抢占系统资源从而导...原创 2019-10-23 20:25:11 · 939 阅读 · 0 评论 -
对象锁和类锁是否会互相影响?
对象锁:Java的所有对象都含有1个互斥锁,这个锁由JVM自动获取和释放。线程进入synchronized方法的时候获取该对象的锁,当然如果已经有线程获取了这个对象的锁,那么当前线程会等待;synchronized方法正常返回或者抛异常而终止,JVM会自动释放对象锁。这里也体现了用synchronized来加锁的1个好处,方法抛异常的时候,锁仍然可以由JVM来自动释放。类...原创 2019-10-23 20:20:11 · 1258 阅读 · 0 评论 -
怎么避免死锁?
一、死锁的定义多线程以及多进程改善了系统资源的利用率并提高了系统的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。下面我们通过一些实例来说明死锁现象。先看生活中的一个实例,2个人一起吃饭但是只有一双筷子,2人轮流吃(同时拥有2只筷子才能吃)。某一个时候,一个拿了左筷子,一人拿了右筷子,2个...原创 2019-10-23 20:19:24 · 2880 阅读 · 0 评论 -
死锁的四个必要条件?
产生死锁的原因主要是:因为系统资源不足。 进程运行推进的顺序不合适。 资源分配不当等。如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。产生死锁的四个必要条件:互斥条件:一个资源每次只能被一个进程使用。 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。...原创 2019-10-23 20:16:36 · 486 阅读 · 0 评论 -
ReentrantLock的内部实现
java可重入锁-ReentrantLock实现细节ReentrantLock支持两种获取锁的方式,一种是公平模型,一种是非公平模型。在继续之前,咱们先把故事元素转换为程序元素。公平锁模型:(占用锁时,状态state +1 ,其他想成想要使用,要排队,当在使用的时候再次进入,状态state再加1。释放一次锁就状态state -1 ,完全释放时状态state 再 -1,然后让排队的线...原创 2019-10-23 20:11:52 · 475 阅读 · 0 评论 -
ReentrantLock 、synchronized和volatile比较
Lock作用:显式加锁原理(1)通过同步器AQS(AbstractQueuedSynchronized类)来实现的,AQS根本上是通过一个双向队列来实现的(2)线程构造成一个节点,一个线程先尝试获得锁,如果获取锁失败,就将该线程加到队列尾部(3)非公平锁的lock方法,调用的sync(NonfairSync和fairSync的父类)的lock方法 public Reent...原创 2019-10-21 22:34:08 · 710 阅读 · 0 评论 -
谈谈NIO的理解
NIO(Non-Blocking IO)的IO处理机制与以往的标准IO机制(BIO,Blocking IO)不同的是,新的机制把重点放在了如何缩短抽象与现实之间的距离上面。NIO中提出了一种新的抽象,NIO 弥补了原来的BIO的不足,它在标准 Java 代码中提供了高速的、面向块的I/O。NIO的包括三个核心概念:缓冲区(Buffer)、通道(Channel)、选择器(Selecto...原创 2019-10-21 22:32:19 · 1010 阅读 · 0 评论 -
谈谈volatile关键字的用法
谈谈volatile关键字的作用volatile关键字经常在并发编程中使用,其特性是保证可见性以及有序性1.volatile保证可见性一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。2)禁止进行指令重排序。例子:...原创 2019-10-21 22:29:52 · 986 阅读 · 0 评论 -
volatile的原理
Volatile工作原理分析1.主要作用是保证变量在多线程之间的可见性;2.volatile在concurrent包中起着举足轻重的作用,为大量的并发类提供了有力的援助;接下来我们从了解CPU缓存开始,然后再深入原理剖析,循序渐进的了解volatile;基础知识:CPU缓存1.传输链路CPU(线程) --》 CPU缓存(一级、二级、三级缓存等) --》 ...原创 2019-10-21 22:25:52 · 1112 阅读 · 0 评论 -
Java中对象的生命周期
Java对象的生命周期在Java中,对象的生命周期包括以下几个阶段:1.创建阶段(Created)2.应用阶段(In Use)3.不可见阶段(Invisible)4.不可达阶段(Unreachable)5.收集阶段(Collected)6.终结阶段(Finalized)7.对象空间重分配阶段(De-allocated)1.创建阶段(Created)在创建...原创 2019-10-21 22:24:06 · 574 阅读 · 0 评论 -
synchronized与Lock的区别
区别:1.用法上的不同:(1)使用范围不同:synchronized既可以加在方法上,也可以加载特定代码块上,而lock需要显示地指定起始位置和终止位置。(2)实现方式不同:synchronized是托管给JVM执行的,lock的锁定是通过代码实现的,它有比synchronized更精确的线程语义。2.性能上的不同:lock接口的实现类ReentrantLock,不仅具有和sy...原创 2019-10-21 22:22:14 · 138 阅读 · 0 评论 -
synchronized 和volatile 关键字的区别
volatile和synchronized特点首先需要理解线程安全的两个方面:执行控制和内存可见。(1)执行控制的目的是:控制代码执行(顺序)及是否可以并发执行。(2)内存可见控制的是:线程执行结果在内存中对其它线程的可见性。(根据Java内存模型的实现,线程在具体执行时,会先拷贝主存数据到线程本地(CPU缓存),操作完成后再把结果从线程本地刷到主存。)synchron...原创 2019-10-21 22:21:43 · 445 阅读 · 0 评论 -
线程如何关闭?
1.使用标志位很简单地设置一个标志位,名称就叫做isCancelled。启动线程后,定期检查这个标志位。如果isCancelled=true,那么线程就马上结束。public class MyThread implements Runnable{ private volatile boolean isCancelled; public void run(){ ...原创 2019-07-29 13:33:35 · 3708 阅读 · 0 评论 -
讲一下java中的同步的方法
如何实现线程同步?为何要使用同步?java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,从而保证了该变量的唯一性和准确性。同步的方式1.同步方法即有synchronized关键字修饰的方法。由于java的每个对象都有一个内置...原创 2019-07-29 13:37:24 · 827 阅读 · 2 评论 -
数据一致性如何保证?
一、基本知识:1.基本术语 术语 英语单词 术语描述 内存屏障 Memory barriers 是一组处理器指令,用于实现对内存操作的顺序限制 缓冲行 Cache line 缓存中可以分配的最小存储单位。处理...原创 2019-07-29 13:41:25 · 4324 阅读 · 0 评论 -
如何保证线程安全?
线程安全的定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。线程安全类型:为了更加深入地理解线程安全,我们将Java语言中各种操作共享的数据分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。(1)不可变 ...原创 2019-07-29 13:42:10 · 1403 阅读 · 0 评论 -
Synchronized用法
synchronize的原理Java中的每个对象都可以作为锁。普通同步方法,锁是当前实例对象。静态同步方法,锁是当前类的class对象。同步代码块,锁是括号中的对象。样例:等待 / 通知机制其相关方法定义在java.lang.Object上,线程A在获取锁后调用了对象lock的wait方法进入了等待状态,线程B调用对象lock的notifyAll()方法,...原创 2019-07-29 13:47:30 · 117 阅读 · 0 评论 -
谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解
先了解相关的锁知识:java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁。获得内置锁的唯一途径就是进入这个锁的保护的同步代码块或方法。java内置锁是一个互斥锁,这就是意味着最多只有一个线程能够获得该锁,当线程A尝试去获得线程B持有的内置锁时,线程A必须等待或者阻塞,知道线程B释放这...原创 2019-07-29 13:50:52 · 2134 阅读 · 0 评论 -
static synchronized 方法的多线程访问和作用
synchronized与static synchronized 的区别:synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是“类的当前实例”,类的两个不同实例就没有这种约束了。那么static synchronized恰好就是要控制类的所有实例的访问了,static synchronized是限制线程同时访问jvm...原创 2019-07-29 13:51:45 · 1331 阅读 · 0 评论 -
同一个类里面两个synchronized方法,两个线程同时访问的问题
代码如上所示,MyObject类有两个方法,分别创建两个线程调用方法A和方法B:会有以下几种情况:1、两个方法都没有synchronized修饰,调用时都可进入:方法A和方法B都没有加synchronized关键字时,调用方法A的时候可进入方法B;2、一个方法有synchronized修饰,另一个方法没有,调用时都可进入:方法A加synchronized关键字而方法B没有加...原创 2019-07-29 13:53:15 · 9383 阅读 · 7 评论 -
进程和线程的区别
线程和进程的区别?一个程序至少有一个进程,一个进程至少有一个线程。(1)定义:进程:进程就是在操作系统上执行的一个程序;比如:qq.exe。是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.(进程之间没有关系,都是相对独立的。每个进程独享一部分内存及其他系统资源。操作系统允许多进程(任务)处理模式)线程:线程是进程的一个实...原创 2019-07-25 13:03:10 · 107 阅读 · 0 评论 -
开启线程的三种方式?
一、继承Thread类创建线程类(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。(2)创建Thread子类的实例,即创建了线程对象。(3)调用线程对象的start()方法来启动该线程。二、通过Runnable接口创建线程类(1)定义runnable接口的实现类,并重写该接口的run()方法...原创 2019-07-25 13:05:58 · 7147 阅读 · 0 评论 -
为什么要有线程,而不是仅仅用进程?
进程还是有很多缺陷的,主要体现在两点上:(1)进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。(2)进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。(如果这两个缺点理解比较困难的话,举个现实的例子也许你就清楚了:如果把我们上课的过程看成一个进程的话,那么我们要做的是耳朵听老师讲课,手上还要...原创 2019-07-25 13:06:31 · 1768 阅读 · 0 评论 -
什么导致线程阻塞?
导致线程阻塞的原因主要有以下几方面。1、线程进行了休眠:线程执行了Thread.sleep(int n)方法,线程放弃CPU,睡眠n毫秒,然后恢复运行。2、线程等待获取同步锁才能进行下一步操作:线程要执行一段同步代码,由于无法获得相关的同步锁,只好进入阻塞状态,等到获得了同步锁,才能恢复运行。3、线程执行wait()进入阻塞状态:线程执行了一个对象的wait()方法,进入阻塞状态,只有...原创 2019-07-25 13:07:14 · 3625 阅读 · 0 评论 -
run()和start()方法区别
多线程原理:相当于玩游戏机,只有一个游戏机(cpu),可是有很多人要玩,于是,start是排队!等CPU选中你就是轮到你,你就run(),当CPU的运行的时间片执行完,这个线程就继续排队,等待下一次的run()。注:调用start()后,线程会被放到等待队列,等待CPU调度,并不一定要马上开始执行,只是将这个线程置于可动行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的...原创 2019-07-25 13:10:10 · 12162 阅读 · 2 评论 -
如何控制某个方法允许并发访问线程的个数?
想控制允许访问线程的个数就要使用到Semaphore。Semaphore有两个方法semaphore.acquire() 和semaphore.release()。semaphore.acquire() :请求一个信号量,这时候的信号量个数-1(一旦没有可使用的信号量,也即信号量个数变为负数时,再次请求的时候就会阻塞,直到其他线程释放了信号量)。semaphore.release() 释放...原创 2019-07-25 13:10:37 · 659 阅读 · 0 评论 -
在Java中wait和sleep方法的不同
wait和sleep的主要区别:(1)调用wait方法时,线程在等待的时候会释放掉它所获得的monitor(监控)调用Thread.sleep()方法时,线程在等待的时候仍然会持有monitor或者锁。另外,Java中的wait方法应在同步代码块中调用,但是sleep方法不需要。(2)另一个区别:Thread.sleep()方法是一个静态方法,作用在当前线程上;...原创 2019-07-29 13:28:13 · 568 阅读 · 0 评论 -
谈谈wait/notify关键字的理解
wait():public final void wait() throws InterruptedException,IllegalMonitorStateException该方法用来将当前线程置入休眠状态,直到接到通知或被中断为止。在调用wait()之前,线程必须要获得该对象的对象级别锁,即只能在同步方法或同步块中调用wait()方法。进入wait()方法后,当前线程释放锁。在...原创 2019-07-29 13:29:40 · 1528 阅读 · 0 评论