JAVA多线程
文章平均质量分 66
Happy_tt
不忘初心,不要着急,总会得到答案!
展开
-
多线程之其他
一、数据类型String的常量池特性在JVM中具有String常量池缓存功能。将Synchronized(string)和String联合使用时,需要注意常量池带来的一些例外。当string的值都相等时,表明两个线程持有的是相同的锁,其中一个线程不停下来,另一个线程将永远不能被执行。因此大多数情况下,synchronized代码块不使用String作为锁对象,而改用其他,比如new Objec原创 2017-09-14 16:24:54 · 308 阅读 · 0 评论 -
定时器Timer
Timer类主要负责计划任务,即在指定时间执行某一个任务。TimerTask是一个抽象类,进行封装任务。创建一个Timer就是启动一个新的线程,默认的新启动的线程不是守护线程,它会一直运行,要使它变成守护线程,则Timer timer=new Timer(true)即可。一、schedule方法1.当执行任务的时间晚于当前的时间,则任务会等到执行任务的计划时间再运行。2.当执行任务原创 2017-09-21 17:15:47 · 358 阅读 · 0 评论 -
synchronized同步语句块
一、用关键字synchronized声明方式时,在某些情况下是有弊端的。比如线程A调用同步方法执行一个长时间的任务,那么线程B必须等待很长的时间即A 线程执行完了才可以开始执行,这样是非常耗时的,在这种情况下就可以使用synchronized同步语句块来实现了。二、synchronized同步代码块的使用1.synchronized(this)(1)当两个并发线程访问同一个对象obje原创 2017-09-12 15:26:08 · 349 阅读 · 0 评论 -
Lock使用----ReentrantRedWriteLock
ReentrantLock具有完全排斥他的效果,即同一个时间只有一个线程在执行。ReentrantRedWriteLock类是一种读写锁。顾名思义包括两个锁,一个是读操作相关的锁即共享锁,即同一时间允许多个线程进行读操作;另一个是写操作相关的锁即排它锁,即同一时间只允许一个线程进行写操作。读锁与写锁是互斥的,写锁与写锁是互斥的,读锁与读锁是共享的,非排斥的。读锁上锁:lock.read原创 2017-09-20 11:51:11 · 384 阅读 · 0 评论 -
Lock的使用---ReentrantLock
ReentrantLock类的作用如同Synchronized,旨在实现线程间的同步。一、初识ReentrantLockMyService.java/* * ReentrantLock实现同步 * lock.lock()持有锁 * lock.unlock():一个线程执行完了以后释放锁 * 结果都是分组输出的,但是哪个线程先输出是随机的 */public class MySer原创 2017-09-20 10:30:24 · 492 阅读 · 0 评论 -
ThreadLocal和InheritableThreadLocal的使用
一、ThreadLocalpublic class Run {public static void main(String[] args) throws InterruptedException{ for(int i=0;i<5;i++){ System.out.println("main="+Tools.t1.get()); Thread.sleep(100); } Thread原创 2017-09-18 16:57:12 · 544 阅读 · 0 评论 -
方法join的使用
很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往早于子线程结束之前结束。若抓线程想等子线程运行结束后再结束,就要用到join()了,join方法的作用是等待线程对象x的销毁。即使所属线程对象正常执行run()方法中的任务,而使当前线程无限期的受阻,等xi成原创 2017-09-18 16:09:04 · 510 阅读 · 0 评论 -
生产者/消费者模式
等待/通知模式最经典的案例即生产者/消费者模式。1.一生产与一消费:操作值2.多生产与多消费:操作值多生产与多消费有可能会造成假死,假死即线程进入warning等待状态。若全部线程进入warning状态,则整个项目处于停止状态。假死出现的原因即有可能连续唤醒同类,即生产者唤醒生产者,消费者唤醒消费者。解决假死的办法即把notify()改为notifyAll(),这样它的原理不光是通原创 2017-09-18 15:03:13 · 435 阅读 · 0 评论 -
使用wait/notify实现线程间通信
线程与线程之间不是独立的个体,他们彼此之间都是可以相互通信和协作的。比如有两个线程A和B,线程A做的是不断地对变量i进行累加,B做的通过while循环,当检测到i的值是10000时则打印出来,这样两个线程实现了通信,但是线程B不停地通过while语句轮询机制来检测某一个条件,这样会浪费CPU资源。因此我们需要一种机制来减少CPU的资源浪费而且还可以实现多个线程之间的通信,即“wait/notify原创 2017-09-18 13:27:40 · 939 阅读 · 0 评论 -
synchronized同步方法
非线程安全会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是脏读,脏读即取到的数据是已经被其他线程更改过的。一、线程安全方法内的变量是线程安全。“非线程安全”问题存在于实例变量中,但如果是方法内部的私有变量则不存在“非线程安全”问题,则所得的结果就是“线程安全”的了。/* * 多个线程对num进行计算时。 */public class HasSelfPriva原创 2017-09-09 09:42:29 · 462 阅读 · 0 评论 -
关于interrupt,interrupted和isInterrupted的理解
(1)interrupt:调用interrupt()方法来停止线程,不会马上终止,它仅仅是在当前的线程中打了一个停止的标记。即不会影响线程的正常运行,只是该线程多了一个停止的标记而已。(2)interrupted:测试的是当前线程是否处于中断状态,是一个静态方法,在一次执行后具有将状态标志清除为false的状态。即连续两次调用该方法后,第二次调用则会返回false。源码如下:原创 2017-08-29 20:48:19 · 645 阅读 · 0 评论 -
volatile关键字
关键字volatile的主要作用是使变量在多个线程间可见,强制从公共堆栈中取得变量的值,volatile就是解决私有堆栈中的值和公共堆栈中的值不同步的问题。synchronized和volatile比较:1.volatile是线程同步的轻量级实现,volatile只能修饰变量,synchronized可以修饰方法以及代码块。2.多线程访问volatile不会发生阻塞,而synchron原创 2017-09-14 17:24:49 · 267 阅读 · 0 评论 -
内置类与同步
一、内部类与静态内部类PublicClass.java/* * 内部类 * 若Run.java和PublicClass.java不在同一个包中,则需要把PrivateClass类声明成public。 * 在PrivateClass前面加上static即为静态内部类 * 静态内部类不能访问外部类的非静态对象 * 非静态内部类中不可以有静态成员。 * 静态类和方法属于类本身。 */原创 2017-09-14 16:44:52 · 378 阅读 · 0 评论 -
多线程this.getName()和Thread.currentThread().getName()
最近在看《java多线程编程核心技术》这本书,在看到currentThread()方法这节时,遇到了不懂的问题,后来查阅了一些资料,整理如下。MyThread.javapublic class MyThread extends Thread { public MyThread() { // TODO Auto-generated constructor stub System.o原创 2017-08-29 09:28:43 · 564 阅读 · 0 评论 -
单例模式和多线程
单例类只能存在一个实例,单例类必须自己创建自己唯一的实例,单例类必须能给其他的所有对象提供这一实例。单例模式主要包括立即加载/饿汉模式、延迟加载/懒汉模式等。单例模式和多线程在一起时,就会出现问题,比如多个线程可以创建多个单例实例,这样是违背单例模型的初衷的。一、立即加载/饿汉模式1.立即加载即在调用方法前,实例已经被创建了,下面看一个实现立即加载和多线程的单例设计模式。MyO原创 2017-09-22 14:33:19 · 269 阅读 · 0 评论