java线程池中线程需要加锁吗

如题所述

如果只是读操作,没有写操作,则可以不用加锁,此种情形下,变量加上final关键字;
如果有写操作,但是变量的写操作跟当前的值无关联,且与其他的变量也无关联,则可考虑变量加上volatile关键字,同时写操作方法通过synchronized加锁;
如果有写操作,且写操作依赖变量的当前值(如:i++),则getXXX和写操作方法都要通过synchronized加锁。
温馨提示:内容为网友见解,仅供参考
无其他回答

关于线程安全问题分析?
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。什么时候考虑到线程安全:...

基于java 线程的几种状态
(1)等待阻塞:运行中的线程执行wait方法,这时候该线程会被放入等待队列。(2)同步阻塞:运行中的线程获取同步锁,如果该同步锁被别的线程占用,这个线程会成被放入锁池,等待其他线程释放同步锁。(3)其他阻塞:运行的线程执行sleep或者join方法这个线程会成为阻塞状态。当sleep超时,join等待线程终止,...

Java中如何保证线程安全性
第一种,修改线程模型。即不在线程之间共享该状态变量。一般这个改动比较大,需要量力而行。第二种,将对象变为不可变对象。有时候实现不了。第三种,就比较通用了,在访问状态变量时使用同步。 synchronized和Lock都可以实现同步。简单点说,就是在你修改或访问可变状态时加锁,独占对象,让其他线程进...

如何判断线程池里面所有的线程执行完成
直到添加到线程池中的任务都已经处理完成,才会退出。在调用shutdown方法后我们可以在一个死循环里面用isTerminated方法判断是否线程池中的所有线程已经执行完毕,如果子线程都结束了,我们就可以做关闭流等后续操作了。

Java Thread BLOCKED和WAITING两种状态的区别
wait不会)。此时主线程会BLOCK住等待lock被释放,此时jstack的输出可以看到main线程状态是BLOCKED。这里要注意的是只有synchronized这种方式的锁(monitor锁)才会让线程出现BLOCKED状态,等待ReentrantLock则不会。3) 让线程处于TIMED_WAITING状态 public static void timedWaiting() { final Object lock = ...

java 线程池 工作队列是如何工作的
下我们以ThreadPoolExecutor为例展示下线程池的工作流程图 1.jpg 2.jpg 1、如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(注意,执行这一步骤需要获取全局锁)。2、如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQueue。3、如果无法将任务加入BlockingQueue(队列已满),则在...

java线程池之ScheduledThreadPoolExecutor实现原理
size加1。 如果数组为0,则将加入的对象放在索引为0的位置,然后设置ScheduledFutureTask的heapIndex的索引(便于后续快速删除)。 调用siftUp做堆的上浮操作,这里是小根堆的操作。 如果队列中第一个元素是传入的对象,则将laader设置null 释放锁 返回truepublicbooleanoffer(Runnablex){if(x==null)thrownewNullPointerExcep...

ThreadLocal原理及使用场景
通常,我们会通过加锁(synchronized或Lock)的方式来解决这一问题。然而,这种方法会对性能产生较大影响。为了解决这个问题,JDK1.2中引入了ThreadLocal类,通过修饰共享变量,使每个线程都单独拥有一份共享变量,从而实现线程间的隔离。ThreadLocal的使用场景与锁的使用场景有所不同。以下是ThreadLocal的使用...

java newCachedThreadPool 线程池使用在什么情况下
开放平台 品牌合作 知道福利 财富商城 特色 经验 宝宝知道 作业帮 手机版 我的知道 java newCachedThreadPool 线程池使用在什么情况下 搜索资料 我来答 分享 微信扫一扫 网络繁忙请稍后重试 新浪微博 QQ空间 举报 浏览18 次 本地图片 图片链接 代码 提交回答 匿名 回答自动保存中为...

Java中如何从线程池中将线程移除?
线程池中的线程称为worker,它是功能就是生产者-消费都模式中的消费者,有个同步锁在请求队列上等待请求数据,我们只要把数据放入请求队列中它就能开始工作,当没有数据时又回到那么锁上等待,也就是那个 run 方法是应该进行一个循环的,一般情况下是根据一个退出条件来决定是否退出,如果不退出那就是...

相似回答