Java锁、多线程

本文详细探讨了Java中的多线程实现方法,包括继承Thread、实现Runnable和Callable接口,以及线程池的使用。此外,还讨论了锁机制的核心概念,如wait、notify、notifyAll、sleep与wait的区别,以及volatile关键字的作用和内存可见性。文章进一步解释了Java线程池的原理和参数配置,以及线程的五种状态。通过对synchronized关键字和ReentrantLock的对比,阐述了两者的差异。最后,介绍了CAS操作和AQS(AbstractQueuedSynchronizer)在并发控制中的应用,以及ThreadLocal的内存管理问题和CountDownLatch、Semaphore的使用场景与底层原理。
摘要由CSDN通过智能技术生成

Java中实现多线程有几种方法

继承Thread类;
实现Runnable接口;
实现Callable接口通过FutureTask包装器来创建Thread线程;
使用ExecutorService、Callable、Future实现有返回结果的多线程

notify()和notifyAll()有什么区别?

notify可能会导致死锁,而notifyAll则不会
因为任何时候只有一个线程可以获得锁,也就是说只有一个线程可以运行synchronized 中的代码。使用notifyall,可以唤醒所有处于wait状态的线程,使其重新进入锁的竞争队列中,而notify只能唤醒一个。wait() 应配合while循环使用,不应使用if,务必在wait()调用前后都检查条件,如果不满足,必须调用notify()唤醒另外的线程来处理,自己继续wait()直至条件满足再往下执行。notify() 是对notifyAll()的一个优化,但它有很精确的应用场景,并且要求正确使用。不然可能导致死锁。正确的场景应该是 WaitSet中等待的是相同的条件,唤醒任一个都能正确处理接下来的事项,如果唤醒的线程无法正确处理,务必确保继续notify()下一个线程,并且自身需要重新回到WaitSet中.

sleep()和wait() 有什么区别?

对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。
sleep()方法导致了程序暂停执行指定的时间,让出cpu给其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。
当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备,获取对象锁进入运行状态。

volatile 是什么?可以保证有序性吗?

1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。
2)禁止进行指令重排序。
3)不保证原子性,和CAS结合,可以保证原子性。
volatile 的一个重要作用就是和 CAS 结合,保证了原子性,详细的可以参见 java.util.concurrent.atomic 包下的类,比如 AtomicInteger。

为什么wait, notify 和 notifyAll这些方法不在thread类里面?

是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了。如果wait()方法定义在Thread类中,线程正在等待的是哪个锁就不明显了。简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。

简述一下你对线程池的理解

合理利用线程池能够带来三个好处。
充分利用多核CPU的计算能力(两个人干活比一个人干活更有效率)
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
缺点:内存泄漏、上下文切换、线程安全、死锁

线程池7个参数

  1. corePoolSize:核心线程数。
  2. maximumPoolSize&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值