Java——多线程
庄生了梦
凡是让你痛苦的,都是让你成长的。
展开
-
实现Runnable接口和继承Thread类区别
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。实现Runnable接口比继承Thread类所具有的优势:1):适合多个相同的程序代码的线程去处理同一个资源2):可以避免java中的单继承的限制3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立直接看代码:1、继承Thread的d原创 2017-02-07 10:39:39 · 1501 阅读 · 0 评论 -
Java多线程-线程的同步与锁
一、同步问题提出线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。例如:两个线程ThreadA、ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据。package cn.thread;public class Foo { private int x = 100; public int getX() { r转载 2017-02-15 14:57:04 · 163 阅读 · 0 评论 -
Java多线程-线程的同步(同步方法)
线程的同步是保证多线程安全访问竞争资源的一种手段。线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源、什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些原则问题需要考虑,是否有竞争资源被同时改动的问题?在本文之前,请参阅《Java多线程-线程的同步与锁》,本文是在此基础上所写的。对于同步,在具体的Java代码中需要完成一下两个操作转载 2017-02-15 14:59:01 · 192 阅读 · 0 评论 -
Java多线程-线程的同步(同步代码块)
对于同步,除了同步方法外,还可以使用同步代码块,有时候同步代码块会带来比同步方法更好的效果。追其同步的根本的目的,是控制竞争资源的正确的访问,因此只要在访问竞争资源的时候保证同一时刻只能一个线程访问即可,因此Java引入了同步代码快的策略,以提高性能。在上个例子的基础上,对oper方法做了改动,由同步方法改为同步代码块模式,程序的执行逻辑并没有问题。package cn转载 2017-02-15 14:59:30 · 212 阅读 · 0 评论 -
java线程同步volatile与synchronized(一)
Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。public volatile boolean exit = false;在定义exit时,使用了一个Java关键字volatile,这个关键字的目的是使exit同步转载 2017-02-15 15:04:16 · 182 阅读 · 0 评论 -
java线程同步volatile与synchronized(二)
前段时间面试时遇到这样一个问题:使用volatile修饰int型变量i,多个线程同时进行i++操作,这样可以实现线程安全吗?我感觉是不可以的,但是又说不出来为什么。下来后翻看了许多资料,终于了解了volatile的含义和用法了,一起来看看吧。提到线程同步,我们经常会想到两个关键字:volatile和synchronized,那么这两者有什么区别呢?volatile是变量修饰符,转载 2017-02-15 15:04:55 · 161 阅读 · 0 评论 -
Java并发:volatile内存可见性和指令重排
volatile两大作用1、保证内存可见性2、防止指令重排此外需注意volatile并不保证操作的原子性。(一)内存可见性1 概念JVM内存模型:主内存和线程独立的工作内存Java内存模型规定,对于多个线程共享的变量,存储在主内存当中,每个线程都有自己独立的工作内存(比如CPU的寄存器),线程只能访问自己的工作内存,不可以访问其它线程的工作内转载 2017-02-23 21:16:35 · 223 阅读 · 0 评论 -
java线程同步volatile与synchronized(三)
1、锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量转载 2017-02-15 15:32:05 · 228 阅读 · 0 评论 -
Java中如何结束线程
一般来说线程执行完run()之后就自动结束了,不过有些时候我们需要线程不停的做一些事情,也就是使用while循环,那么这时候该如何停止线程呢?这个问题需要分情况来讨论,如果线程做的事情不是耗时的,那么只需要使用一个标志即可,具体的代码如下:[java] view plain copy class MyThread extends Thread转载 2017-02-15 15:34:45 · 1826 阅读 · 1 评论 -
乐观锁以及乐观锁的实现
乐观锁以及乐观锁的实现一、为什么需要锁(并发控制)? 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。 典型的冲突有: 1.丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。例如:用户A把值从6改为2,用户B把值从2改为6,则用户A丢失了他的更新。 2.脏读:当一转载 2017-02-15 17:39:04 · 902 阅读 · 0 评论 -
mysql乐观锁总结和实践
上一篇文章《MySQL悲观锁总结和实践》谈到了MySQL悲观锁,但是悲观锁并不是适用于任何场景,它也有它存在的一些不足,因为悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。如果加锁的时间过长,其他用户长时间无法访问,影响了程序的并发访问性,同时这样对数据库性能开销影响也很大,特别是对长事务而言,这样的开销往往无法承受。所以与悲观锁相对的,我们有了乐观锁,具体参见下面介绍:转载 2017-02-15 18:02:55 · 171 阅读 · 0 评论 -
单例模式中用volatile和synchronized来满足双重检查锁机制
背景:我们在实现单例模式的时候往往会忽略掉多线程的情况,就是写的代码在单线程的情况下是没问题的,但是一碰到多个线程的时候,由于代码没写好,就会引发很多问题,而且这些问题都是很隐蔽和很难排查的。例子1:没有volatile修饰的uniqueInstancepublic class Singleton { private static Singleton uniqueInsta原创 2017-03-03 15:17:28 · 269 阅读 · 0 评论 -
Java中synchronized的实现原理与应用
Java中的每一个对象都可以作为锁,而在Synchronized实现同步的几种方式中分别为:普通同步方法:锁是当前实例对象静态同步方法:锁是当前类的Class对象同步方法块:锁是Synchronized括号里配置的对象任何一个对象都一个Monitor与之关联,当且一个Monitor被持有后,它将处于锁定状态。Synchronized在JVM里的实现都是基于进入和退出Monitor对转载 2017-02-16 08:40:13 · 315 阅读 · 0 评论 -
HashMap和Hashtable的区别
HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。HashMap的工作原理、ArrayList与Vector的比较以及这个问题是有关Java 集合框架的最经典的问题。Hashtable是个过时的集合类,存在于Java API中很久了。在Java 4中被重写了,实现了Map接口,所以自此以后也成了Java转载 2017-02-23 21:13:52 · 239 阅读 · 0 评论 -
双重检查锁定与延迟初始化
本来是看到多线程中关于安全发布的问题,然后想起来之前看过文章说双重检查锁定也不能解决安全发布的问题,但是不记得为什么了。于是,就去搜了一下,这篇转载的文章写的挺清楚的(本来还打算自己写)。本文转自双重检查锁定与延迟初始化ifeve.com 主要是介绍并发相关内容的网站,有自己原创内容,也有翻译外文,很给力。双重检查锁定的由来在Java程序中,有时候可能需转载 2017-02-23 16:44:30 · 305 阅读 · 0 评论 -
Java 并发:并发背景
摘要: 并发与操作系统的生命历程息息相关。进程的出现,使得程序状态的保存变为现实,为进程间的切换提供了可能,实现了操作系统的并发,大大提高资源利用率。虽然进程的出现解决了操作系统的并发问题,但人们对实时性又有了更高的要求。由于一个进程由若干个子任务组成,所以人们就发明了线程,让每个线程负责一个独立的子任务,提高程序的响应灵敏度。一个进程虽然包括多个线程,但是这些线程是共同享有进程占有的资转载 2017-02-14 14:08:33 · 193 阅读 · 0 评论 -
Java 并发:volatile 关键字解析
摘要: 在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性、可见性和有序性。只要有一条原则没有被保证,就有可能会导致程序运行不正确。volatile关键字 被用来保证可见性,即保证共享变量的内存可见性以解决缓存一致性问题。一旦一个共享变量被 volatile关键字 修饰,那么就具备了两层语义:内存可见性和禁止进行指令重排序。在多线程环境下,vola转载 2017-02-14 14:07:49 · 166 阅读 · 0 评论 -
线程、多线程与线程池总结
先看几个概念:线程:进程中负责程序执行的执行单元。一个进程中至少有一个线程。多线程:解决多任务同时执行的需求,合理使用CPU资源。多线程的运行是根据CPU切换完成,如何切换由CPU决定,因此多线程运行具有不确定性。线程池:基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程原创 2017-02-07 11:06:48 · 219 阅读 · 0 评论 -
我是一个线程
我是一个线程,我一出生就被编了个号: 0×3704,然后被领到一个昏暗的屋子里, 这里我发现了很多和我一模一样的同伴。我身边的同伴0×6900待的时间比较长, 他带着沧桑的口气对我说:“我们线程的宿命就是处理包裹。把包裹处理完以后还得马上回到这里,否则可能永远回不来了。”我一脸懵懂,包裹,什么包裹?“不要着急,马上你就会明白了, 我们这里是不养闲人的。”果然转载 2017-02-07 11:18:01 · 208 阅读 · 0 评论 -
【Java并发编程实战】—–synchronized
在我们的实际应用当中可能经常会遇到这样一个场景:多个线程读或者、写相同的数据,访问相同的文件等等。对于这种情况如果我们不加以控制,是非常容易导致错误的。在Java中,为了解决这个问题,引入临界区概念。所谓临界区是指一个访问共用资源的程序片段,而这些共用资源又无法同时被多个线程访问。在java中为了实现临界区提供了同步机制。当一个线程试图访问一个临界区时,他将使用一种同步机制来查看是不是已经转载 2017-02-07 13:43:24 · 313 阅读 · 0 评论 -
Java之Thread线程相关yield()、sleep()、wait()、join()、run和start区别详解
1、sleep()使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的转载 2017-02-17 09:59:33 · 449 阅读 · 0 评论 -
Java中sleep()与wait()区别
学习时正好碰到这两个方法,就查阅相关资料,并通过程序实现,进行区别一下:1、每个对象都有一个锁来控制同步访问,Synchronized关键字可以和对象的锁交互,来实现同步方法或同步块。sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!);wa转载 2017-02-21 12:44:05 · 256 阅读 · 0 评论 -
Java 多线程——基础知识
在这篇文章里,我们关注多线程。多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性、如何创建线程、线程的状态切换以及线程通信等。线程是操作系统运行的基本单位,它被封装在进程中,一个进程可以包含多个线程。即使我们不手动创造线程,进程也会有一个默认的线程在运行。对于JVM来说,当我们编写一个单线程的程序去运行时,JVM中也是有至少两个线程在运行,一个是我们创建的程序,转载 2017-02-21 13:39:55 · 301 阅读 · 0 评论 -
Java创建线程的两个方法
Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程,有两种方法:◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法; ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法。转载 2017-02-21 13:40:42 · 376 阅读 · 0 评论 -
Java 多线程 —— synchronized关键字
多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题。同步机制可以使用synchronized关键字实现。当synchronized关键字修饰一个方法的时候,该方法叫做同步方法。当synchronized方法执行完或发生异常时,会自动释放锁。下面通过一个例子来对synchronized关键字的用法进转载 2017-02-21 13:41:46 · 211 阅读 · 0 评论 -
java 多线程—— 线程等待与唤醒
第1部分 wait(), notify(), notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而no转载 2017-02-21 13:43:29 · 1721 阅读 · 0 评论 -
Java 并发:内置锁 Synchronized
摘要: 在多线程编程中,线程安全问题是一个最为关键的问题,其核心概念就在于正确性,即当多个线程访问某一共享、可变数据时,始终都不会导致数据破坏以及其他不该出现的结果。而所有的并发模式在解决这个问题时,采用的方案都是序列化访问临界资源 。在 Java 中,提供了两种方式来实现同步互斥访问:synchronized 和 Lock。本文针对 synchronized 内置锁 详细讨论了其在转载 2017-02-14 14:00:18 · 643 阅读 · 1 评论 -
Java 并发:Thread 类深度解析
摘要: Java 中 Thread类 的各种操作与线程的生命周期密不可分,了解线程的生命周期有助于对Thread类中的各方法的理解。一般来说,线程从最初的创建到最终的消亡,要经历创建、就绪、运行、阻塞 和 消亡 五个状态。在线程的生命周期中,上下文切换通过存储和恢复CPU状态使得其能够从中断点恢复执行。结合 线程生命周期,本文最后详细介绍了 Thread 各常用 API。一转载 2017-02-14 14:00:56 · 227 阅读 · 0 评论 -
Java 并发:深入理解 ThreadLocal
摘要: ThreadLocal 又名线程局部变量,是 Java 中一种较为特殊的线程绑定机制,用于保证变量在不同线程间的隔离性,以方便每个线程处理自己的状态。进一步地,本文以ThreadLocal类的源码为切入点,深入分析了ThreadLocal类的作用原理,并给出应用场景和一般使用步骤。一. 对 ThreadLocal 的理解1). ThreadLocal 概述转载 2017-02-14 14:01:29 · 252 阅读 · 0 评论 -
Java 并发:线程间通信与协作
摘要: 线程与线程之间不是相互独立的个体,它们彼此之间需要相互通信和协作,最典型的例子就是生产者-消费者问题。本文首先介绍 wait/notify 机制,并对实现该机制的两种方式——synchronized+wait-notify模式和Lock+Condition模式进行详细剖析,以作为线程间通信与协作的基础。进一步地,以经典的生产者-消费者问题为背景,熟练对 wait/notify 机制转载 2017-02-14 14:03:08 · 246 阅读 · 0 评论 -
Java 并发:Lock 框架详解
摘要: 我们已经知道,synchronized 是Java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问,但 synchronized 粒度有些大,在处理实际问题时存在诸多局限性,比如响应中断等。Lock 提供了比 synchronized更广泛的锁操作,它能以更优雅的方式处理线程同步问题。本文以synchronized与Lock的对比为切入点,对Java中转载 2017-02-14 14:06:01 · 229 阅读 · 0 评论 -
mysql悲观锁总结和实践
最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科):悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制转载 2017-02-15 17:59:09 · 1263 阅读 · 0 评论