
多线程
文章平均质量分 79
执键行天涯、
国企程序猿 5年工作经验
展开
-
【JAVA高级】ReadWriteLock 读写锁
🌹🌹期待您的关注 🌹🌹,让我们共同进步!ReentrantReadWriteLock可重入读写锁是读写锁的唯一实现。多个线程同时读一个资源类没有任何问题,所以为了满足并发量,读取共享资源应该可以同时进行。但是,如果有一个线程想去写共享资源类,就不应该再有其他线程可以对该资源进行读或写。原创 2024-09-06 10:28:02 · 315 阅读 · 0 评论 -
【JAVA高级】Semaphore信号量的使用介绍
而Semaphore可以解决这个问题,比如6辆车3个停车位,对于CountDownLatch只能停3辆车,而Semaphore可以停6辆车,车位空出来后,其它车可以占有,这就涉及到了Semaphore.accquire()和Semaphore.release()方法。● acquire(获取) 当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),要么一直等下去,直到有线程释放信号量,或超时。信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。原创 2024-09-06 10:19:28 · 353 阅读 · 0 评论 -
【JAVA高级】并发同步工具CyclicBarrier 的使用介绍
CyclicBarrier 是 Java 中的另一个同步辅助类,它可以让一组线程互相等待,直到所有线程都达到一个屏障点后再继续执行。与CountDownLatch 不同的是,CyclicBarrier的计数器可以循环使用,当所有线程都到达屏障点后,计数器会重置,可以被复用。所谓 Cyclic 即循环的意思,所谓 Barrier即屏障的意思。所以综合起来,CyclicBarrier 指的就是循环屏障,虽然这个叫法很奇怪,但是却能很好地表达其含义。原创 2024-09-05 18:41:44 · 1344 阅读 · 0 评论 -
【多线程】方法中定义的局部变量是否为线程安全的?
如果有多个线程操作一个局部变量,这个局部变量此时也就是共享数据,这个局部变量可能是线程安全的,也可能是线程不安全的,怎么区分呢?在Java中,成员方法(也称为实例方法)中的局部变量本身并不直接涉及线程安全的问题,因为局部变量是存储在栈(stack)上的,每个线程调用方法时都会在栈上创建自己的局部变量副本。而有的局部变量是线程不安全的?然而,需要注意的是,局部变量本身虽然是线程安全的,但如果局部变量引用了非线程安全的对象(如共享资源),并且这些对象在多个线程中被修改,那么就会存在线程安全问题。原创 2024-09-05 15:11:00 · 452 阅读 · 0 评论 -
【多线程】线程池之exectue与submit的区别
背景:在日常进行多线程的开发过程中,遇见了有的线程池用excute提交子线程任务,有的使用submit提交线程任务。execute和submit都属于线程池的方法,那这两种有什么区别呢?我们一起来验证一下。原创 2024-09-04 10:01:37 · 752 阅读 · 0 评论 -
【不安全的集合类】同步容器(ConcurrentHashMap)、并发集合(CopyOnWriteArrayList)
CopyOnWrite容器即写时复制的容器,往一个容器中添加元素的时候,不直接往当前容器Object[]添加,而是现将当前容器Object[]进行Copy,而是复制出一个新的容器Object[] newElements向新容器添加元素,添加之后,再将原容器的引用指向新的容器setArray(newElements);这里浅说一下HashSet的源码,HashSet其实就是一个HashMap,HashSet的中存的值是HashMap的key,HashMap中的Value是一个固定对象PRESENT。原创 2024-09-02 22:21:25 · 926 阅读 · 0 评论 -
【多线程】线程间通信 之虚假唤醒和中断
两个线程,可以操作初始值为0的一个变量,实现一个线程对该变量+1,一个线程对该变量-1,实现交替,来10轮,变量初始值为0,以实现此问题作为引入,简化我们的理解。原创 2024-09-02 17:39:38 · 916 阅读 · 0 评论 -
【多线程】并发编程wait和sleep的区别
wait():wait()方法必须在同步方法或同步代码块中调用,因为它要求调用线程必须拥有对象的锁。wait():调用wait()方法的线程会释放它持有的对象锁,并进入等待状态,直到其他线程调用该对象的notify()或notifyAll()方法来唤醒它。wait():wait()方法被调用后,可以通过其他线程调用该对象的notify()或notifyAll()方法来唤醒。sleep():sleep()方法睡眠指定时间之后,线程会自动苏醒,或者通过调用interrupt()方法提前打断睡眠。原创 2024-09-02 16:09:18 · 367 阅读 · 0 评论 -
【线程间通信】sleep/wait/notify/notifyAll作用及使用
wait和notify都要先获取到锁才能使用。获取到锁后,使用wait,线程会先释放锁对象,然后阻塞等待;使用notify,会通知在同一个锁对象上等待的线程,如果当前有多个线程在等待同一个锁对象,会随机唤醒一个等待的线程;而notifyAll,是所有线程都唤醒,这些线程再一起竞争锁。原创 2024-09-02 14:17:21 · 1027 阅读 · 0 评论 -
【线程安全】ReentrantLock和synchronized的使用示例——言简意赅
三个进货员 分别进货 500000次、50000、50000次,一共应该进来600000箱;* 笔记:如何编写企业级的多线程代码 *其中应用到了Lambda表达式,表达式未简化之前样式可见上面注释代码。固定的变成套路+模板是什么?原创 2024-08-27 18:08:27 · 450 阅读 · 0 评论 -
线程安全性分析 及 成员变量、实例变量、局部变量、类变量的区别及存储
静态变量前要加static关键字,而实例变量前则不加。原创 2024-08-27 10:27:30 · 2111 阅读 · 6 评论 -
什么变量需要去考虑多线程之间的线程安全问题
总之,在多线程编程中,任何可能被多个线程访问和修改的共享变量都需要考虑线程安全问题。通过合理的设计和使用同步机制,可以有效地避免线程安全问题,保证程序的正确性和稳定性。在多线程编程中,线程安全问题主要发生在多个线程访问并修改同一份共享资源时。原创 2024-08-26 11:04:41 · 281 阅读 · 0 评论 -
【多线程综合】java何时考虑线程安全问题、怎么考虑、又怎么解决?
多线程怎么考虑,什么时候需要考虑,怎么实现?原创 2024-07-16 17:44:14 · 1517 阅读 · 0 评论 -
【多线程】synchronized 原理、使用、注意事项详解
synchronized是Java的一个关键字。来自官方的解释:Synchronized方法支持一种简单的策略,用于防止线程干扰和内存一致性错误:如果一个对象对多个线程可见,则对该对象变量的所有读或写操作都通过Synchronized方法完成。Synchronized保证同一时刻有且只有一条线程在操作共享数据,其他线程必须等待该线程处理完数据后再对共享数据进行操作。原创 2024-07-25 16:12:20 · 1036 阅读 · 0 评论 -
【lamda表达式】在多线程开发中的lamda表达书简化参数
很明显其中的 executor.execute()中传的参数还是Runnable类型,只不过这个类型参数中的run方法中只有一行调用handle()方法的代码,所以简化完之后就变成了 executor.execute(() -> handle());这个还需要多多使用,慢慢就熟练了。创建线程后传Runnable参数并实现run方法,可以采用下面两种方式,效果是一样的。对于线程池中提交任务代码,也可以这样简化:可以采用下面两种方式,效果是一样的。原创 2024-07-24 15:56:13 · 477 阅读 · 0 评论 -
【多线程】线程池提交的任务,被拒绝策略处理时,能不能获取到当时子任务的实例对象呢? 队列的处理,排队效果模拟
我通过匿名内部类的方式自定义了一个拒绝策略,并实现了其中的拒绝方法rejectedExecution(),而对于其中固定的参数,是否可以通过转换获取到真实的Runnable实现类的实例呢。接下来我们一起验证一下,同时也看下具体,线程池提交一些任务,哪个任务会进队列,哪个会被核心线程直接执行,哪个又会被拒绝。说明:因为每个子任务需要执行的业务逻辑没有,我通过sleep()来模拟实际业务花费的时间;为了看一下拒绝策略的拒绝效果是什么样的。原创 2024-07-18 09:56:25 · 623 阅读 · 0 评论 -
【多线程】线程池中的队列有哪些,应该如何选择
线程池中的队列是线程池的重要组成部分,用于存放待执行的任务。在Java中,线程池常用的队列类型包括无界队列、有界队列、直接提交队列(SynchronousQueue)、优先级队列等。原创 2024-07-17 10:37:21 · 3650 阅读 · 0 评论 -
【多线程】线程池的最优参数设置,如何考虑?
(2)而CachedThreadPool允许的最大线程数量为Integer.MAX_VALUE,而且核心线程数为0,意味着 只要有任务进来,就会频繁创建新线程,没有任务之后又要关闭线程,耗费性能。另一方面,由于允许创建大量的线程,也有导致OOM的潜在隐患。为了最大程度利用线程池的资源,充分发挥线程池的执行效率,需要对线程池的主要参数进行合理的设置,对于不同的业务和场景,也需要根据实际情况来进行调整。如果线程池中的线程数小于核心线程数,新的任务将创建新线程来处理,即使有核心线程处于空闲状态。原创 2024-07-17 09:31:32 · 1721 阅读 · 0 评论 -
【多线程】多线程之哪些内容需要考虑线程安全问题?
多线程原创 2024-07-16 14:33:59 · 926 阅读 · 0 评论