![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java系列
文章平均质量分 84
Java基础技术
老猫喜欢今日爬山
不积跬步无以至千里
展开
-
Java多线程之CAS及原子操作
CAS 操作时抱着乐观的态度进行的,它总是认为自己可以成功完成操作。所以CAS也叫作乐观锁,那什么是悲观锁呢?悲观锁就是我们“家喻户晓”的synchronized。悲观锁的思想你可以这样理解,一个线程想要去获得这个锁但是却获取不到,必须要别人释放了才可以。现在我们使用AtomicInteger类并且调用了incrementAndGet方法来对a进行自增操作。这个incrementAndGet是如何实现的呢?我们可以看一下AtomicInteger的源码。原创 2023-11-15 14:29:22 · 62 阅读 · 0 评论 -
深入理解JMM(Java内存模型)
Java内存模型(Java Memory Model简称JMM)是一种抽象的概念,并不真实存在,它描述的一组规则或者规范。通过这些规则、规范定义了程序中各个变量的访问方式。jvm运行的程序的实体是线程,而每个线程运行时,都会创建一个工作内存(也叫栈空间),来保存线程所有的私有变量。而JMM内存模型规范中规定所有的变量都存储在主内存中,而主内存中的变量是所有的线程都可以共享的,而对主内存中的变量进行操作时,必须在线程的工作内存进行操作,首先将主内存的变量copy到工作内存,进行操作后,再将变量刷回到主内存中。原创 2023-11-15 11:15:02 · 101 阅读 · 0 评论 -
Java多线程的3种等待唤醒机制
permit相当于1,0的开关,默认是0,调用一次unpark就加1变成1,调用一次park会消费permit,也就是将1变成o,同时park立即返回。如再次调用park会变成阻塞(因为permit为零了会阻塞在这里,一直到permit变为1),这时调用unpark会把permit置为1。LockSupport和每一个使用它的线程之间有一个许可(permit)进行关联,permit有0和1两种状态,默认为0,即无许可证状态。而unpark则相反,它会增加一个凭证,但凭证最多只能有1个,累加无效。原创 2023-11-10 14:16:24 · 256 阅读 · 0 评论 -
Java多线程interrupt、interrupted、isInterrupted详解
这里牵扯到并发于并行的概念,这里从主线程运行,而thread1是主线程下的线程,这里先执行的是interrupt()方法,然后才执行的是sleep方法,所以打断的时候它是正常的线程,打断状态为true。如果我们换成下面这些代码则会让thread1先睡眠,后打断,这样就会在睡眠阻塞中被打断那么就会刷新,这样打断位就为false!Thread类的实例方法,其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但。Thread类的实例方法,作用是只测试此线程是否被中断,原创 2023-11-10 11:24:15 · 590 阅读 · 0 评论 -
Java多线程3种中断方式和终止方式
1、调用 stop() 方法会立刻停止 run() 方法中剩余的全部工作,包括在 catch 或 finally 语句中的,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。使用interrupt()方法,仅仅是给线程打上中断标记位,并没有实际中断线程(把中断的权利交给线程本身,更安全)() 方法确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且该方法已被弃用,最好不要使用它。()等方法来管理线程。原创 2023-11-10 10:45:31 · 1032 阅读 · 0 评论 -
Java多线程之8锁案例
即便是用同一个对象调用两个方法,锁的对象也不是同一个,所以两个方法用的不是同一个锁,后调用的方法不需要等待先调用的方法。因为两个方法锁的对象不是同一个,所以两个方法用的不是同一个锁,后调用的方法不需要等待先调用的方法。因为两个同步方法都被static修饰了,即便用了两个不同的对象调用方法,两个方法用的还是同一个锁,后调用的方法需要等待先调用的方法。因为用了两个对象调用各自的方法,所以两个方法的调用者不是同一个,所以两个方法用的不是同一个锁,后调用的方法不需要等待先调用的方法。原创 2023-11-10 10:13:48 · 179 阅读 · 0 评论 -
Java中的悲观锁与乐观锁
总之,在Java中,悲观锁和乐观锁都是实现并发控制的重要手段,需要根据具体情况来选择适当的机制。悲观锁(Pessimistic Lock)是一种传统的线程同步方式,它假设在整个数据处理过程中,其他线程可能会修改数据,因此在访问共享资源之前,需要先对其进行加锁,这样可以避免其他线程修改数据,从而保证数据的安全性。乐观锁是一种并发控制的方式,它假设数据冲突的概率比较小,因此在访问共享资源时不会加锁,而是在更新数据时检查数据是否被其他线程进行了修改,如果没有则更新成功,否则需要重新尝试。原创 2023-11-09 09:24:28 · 23 阅读 · 0 评论 -
JUC 之 CompletableFuture使用详解
exceptionally:返回一个新的CompletableFuture,当前面的CompletableFuture完成时,它也完成,当它异常完成时,给定函数的异常触发这个CompletableFuture的完成。方法不以Async结尾,意味着Action使用相同的线程执行,而Async可能会使用其它的线程去执行(如果使用相同的线程池,也可能会被同一个线程选中执行)。allOf():当所有给定的 CompletableFuture 完成时,返回一个新的 CompletableFuture。原创 2023-11-08 18:00:02 · 208 阅读 · 0 评论 -
Java Future获取异常
在上面的代码示例中,我们创建了一个 ExecutorService,并使用 submit() 方法提交了一个任务。如果任务抛出了异常,我们通过 getCause() 方法获取到异常,并打印出异常信息。当一个任务抛出异常时,我们可以通过 Future 的 get() 方法捕获 ExecutionException 并获取到异常的信息。Future 提供了一个 get() 方法来获取任务的结果,如果任务出现了异常,则 get() 方法会抛出 ExecutionException 异常。原创 2023-11-08 17:30:12 · 991 阅读 · 0 评论 -
Java多线程Runnable和Callable区别
Runnable 和 Callable 都是 Java 中用于多线程编程的接口,它们的主要区别在于是否返回结果和是否抛出异常。原创 2023-11-08 17:25:15 · 106 阅读 · 0 评论 -
Java8 Stream收集器collect操作
最终返回Map。: 将Stream中的元素,分为两组: predicate通过的分到key为true的组,否者分到key为false的组,然后通过downstream再对每组进行统计(得到统计结果D),最后得到并返回Map。提示: 串行流下的reduce与并行流下的reduce可能结果不一样,如果不太熟悉的话,建议使用stream的reduce(),而不使用.stream().collect(Collectors.reducing())。原创 2023-06-29 13:14:31 · 1045 阅读 · 1 评论 -
java8 Stream 基本操作
以下整理了 Java8 流操作的常用方法及实例。原创 2023-06-29 13:56:44 · 599 阅读 · 0 评论 -
Java8 中的双冒号(::)运算符的使用-方法引用
英文:double colon,双冒号(::)在Java 8中被用作,方法引用是与lambda表达式相关的一个重要特性。它提供了一种不执行方法的方法。为此,方法引用需要由兼容的函数接口组成的目标类型上下文。使用lambda表达式会创建匿名方法, 但有时候需要使用一个lambda表达式只调用一个已经存在的方法(不做其它), 所以这才有了方法引用!原创 2023-06-29 10:50:49 · 629 阅读 · 1 评论 -
Lamdba表达式的几种形式
Java Lamdba 表达式的几种表现形式总结原创 2023-06-29 10:18:56 · 106 阅读 · 1 评论