多线程
想跑步丶小胖子
爱学习的小胖子
展开
-
测试多个线程调用同一静态方法(无静态变量)时是否有线程安全问题
测试多个线程调用同一静态方法(无静态变量)时是否有线程安全问题思路:使用两个线程调用同一静态方法(该静态方法不引用静态变量)、第一个线程被阻塞的时间大于第二个线程被阻塞的时间,若第一个线程与第二个线程的输出结果相同,则两个线程调用同一静态方法存在线程安全问题,若第一个线程于第二个线程的输出结果不同,则两个线程调用同一静态方法不存在线程安全问题;package com.shawearn....转载 2018-09-21 09:20:22 · 567 阅读 · 0 评论 -
Java并发编程:Callable、Future和FutureTask
Java并发编程:Callable、Future和FutureTask在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。 而自从Java 1.5开始,就提...转载 2018-09-27 09:29:38 · 117 阅读 · 0 评论 -
BlockingQueue的使用
BlockingQueue的使用本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状 态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状 态,直到BlockingQueue里有空间才会被唤醒继续操作. ...转载 2018-09-27 09:29:48 · 582 阅读 · 0 评论 -
LinkedBlockingQueue
LinkedBlockingQueueLinkedBlockingQueue是一个基于已链接节点的、范围任意的blocking queue的实现。 此队列按 FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。 新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列, ...转载 2018-09-27 09:29:56 · 134 阅读 · 0 评论 -
Java5 并发学习
Java5 并发学习在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动、调度、管理线程的一大堆API了。在Java5以后,通过 Executor来启动线程比用Thread的start()更好。在新特征中,可以很容易控制线程的启动、执行和关闭过程,还可以很容易使用线程池的特 性。 一、创建任务 任务就是一个实现了Runnable接口的类。创建的时候实run...转载 2018-09-27 09:30:09 · 127 阅读 · 0 评论 -
Java多线程性能优化
Java多线程性能优化大家使用多线程无非是为了提高性能,但如果多线程使用不当,不但性能提升不明显,而且会使得资源消耗更大。下面列举一下可能会造成多线程性能问题的点: 死锁 过多串行化 过多锁竞争 切换上下文 内存同步 下面分别解析以上性能隐患死锁关于死锁,我们在学习操作系统的时候就知道它产生的原因和危害,这里就不从原理上去累述了,可以从...转载 2018-09-21 10:52:42 · 2400 阅读 · 0 评论 -
多线程访问成员变量与局部变量
多线程访问成员变量与局部变量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...转载 2018-09-21 10:47:11 · 225 阅读 · 0 评论 -
Java实现主线程等待子线程join,CountDownLatch
Java实现主线程等待子线程本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明:1、使用Thread的join()方法,join()方法会阻塞主线程继续向下执行。2、使用Java.util.concurrent中的CountDownLatch,是一个倒数计数器。初始化时先设置一个倒数计数初始值,每调用一次countDown()方法,倒数值减一,他的await()方法会阻塞当前进...转载 2018-09-21 10:45:01 · 373 阅读 · 0 评论 -
Synchronized块同步变量的误区
Synchronized块同步变量的误区我们可以通过synchronized块来同步特定的静态或非静态方法。要想实现这种需求必须为这些特性的方法定义一个类变量,然后将这些方法的代码用synchronized块括起来,并将这个类变量作为参数传入synchronized块。下面的代码演示了如何同步特定的类方法: Java代码 public class SyncThread exten...转载 2018-09-21 10:43:44 · 1624 阅读 · 0 评论 -
线程中释放锁的方式
线程中释放锁的方式# 调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) {...} 代码段内。# 调用obj.wait()后,线程A就释放了obj的锁,否则线程B无法获得obj锁,也就无法在synchronized(obj) {...} 代码段内唤醒A。# 当obj.wait()方法返回后,线程A需要再次获得obj锁,才...转载 2018-09-21 10:20:49 · 2173 阅读 · 0 评论 -
wait、notify/notifyAll,sleep
1.wait、notify/notifyAll,sleep 详解1、wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。2、wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用,即,一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。3、...转载 2018-09-21 10:19:14 · 125 阅读 · 0 评论 -
synchronized 修饰在 static方法和非static方法的区别
synchronized 修饰在 static方法和非static方法的区别Java中synchronized用在静态方法和非静态方法上面的区别 在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法。也可以synchronized来修饰方法里面的一个语句块。那么,在static方法和非static方法前面加synchronized到底有什...转载 2018-09-21 09:24:41 · 173 阅读 · 0 评论 -
在多线程情况下 局部变量与全局变量 哪个比较安全呢
在多线程情况下 局部变量与全局变量 哪个比较安全呢局部变量是在堆栈中运行。每个运行的线程都有自己的堆栈。别的线程无法访问得到,因此我们说,局部变量是“安全”的。全局变量在堆中,堆是对所有的线程都可见的。因此在两个以上的线程访问全局变量时,就会出现所谓的“不安全”,a线程访问全局变量,赋值为a,然后中间睡眠了0.001秒,在此期间b进程访问了全局变量,赋值为b了,此时a线程醒来了,抢了处理...转载 2018-09-21 09:23:11 · 1227 阅读 · 0 评论 -
一个函数能否被两个线程同时调用
一个函数能否被两个线程同时调用 其实你可以这样想,函数本身只是代码,代码是只读的,无论多少个线程同时调都无所谓(因为只读嘛)。但是函数里面总要用到数据,如果数据属于线程(比如函数参数、局部变量,存在栈上,每个线程都有自己的栈),那么同时调还是没关系,因为用的本线程的数据;但是如果用了一些全局数据,比如全局变量,同时操作一个数据结构(如对一个链表有什么操作),那就不行了,这时候锁就出来了。...转载 2018-09-21 09:21:23 · 6014 阅读 · 0 评论