目录

T の weblog

标签: 并发 (8)

Java中的Unsafe类

这是一个普通类的创建 ... 仅仅只需要一行代码就完成了对象的实例化 这是Unsafe类的创建... 通过一个静态方法的调用,而方法中通过反射的方式创建出来Unsafe对象,为什么它需要通过这样的方式创建出来?

Java中的Atomic

说一说Java中的Atomic

【LeetCode刷题】1115. 交替打印FooBar

题目 我们提供一个类: class FooBar { public void foo() { for (int i = 0; i < n; i++) { print("foo"); } } public void bar() { for (int i = 0; i < n; i++) { print("bar"); } } } 两个不同的线程将会共用一个 FooBar 实例。其中一个线程将会调用 foo() 方法,另一个线程将会调用 bar() 方法。 请设计修改程序,以确保 "foobar" 被输出 n 次。 示例 1: 输入: n = 1 输出: "foobar" 解释: 这里有两个线程被异步启动。其中一个调用 foo() 方法, 另一个调用 bar() 方法,"foobar" 将被输出一次。 示例 2: 输入: n = 2 输出: "foobarfoobar" 解释: "foobar" 将被输出两次。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/print-foobar-alternately 著作....

【LeetCode刷题】按序打印

原题:按序打印 我们提供了一个类: public class Foo { public void one() { print("one"); } public void two() { print("two"); } public void three() { print("three"); } } 三个不同的线程将会共用一个 Foo 实例。 线程 A 将会调用 one() 方法 线程 B 将会调用 two() 方法 线程 C 将会调用 three() 方法 请设计修改程序,以确保 two() 方法在 one() 方法之后被执行,three() 方法在 two() 方法之后被执行。 示例 1: 输入: [1,2,3] 输出: "onetwothree" 解释: 有三个线程会被异步启动。 输入 [1,2,3] 表示线程 A 将会调用 one() 方法,线程 B 将会调用 two() 方法,线程 C 将会调用 three() 方法。 正确的输出是 "onetwothree"。 示例 2: 输入: [1,3,2] 输出: "onetwothree" 解释: 输入 [1,3,2] 表示....

Java中的一些并发工具

1. 【转载】类CountDownLatch 1.1 CountDownLatch介绍 CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有框架服务之后执行。 1.2 CountDownLatch原理 CountDownLatch是通过一个计数器来实现的,计数器的初始化值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已完成任务,然后在闭锁上等待的线程就可以恢复执行任务。 1.2.1 CountDownLatch的伪代码 Main thread start Create CountDownLatch for N threads Create and start N threads Main thead wait on latch N threads completes there tasks are returns Main thread resume execution 1.2.2 CountDownLatch....

JAVA并发编程: CAS和AQS

说起JAVA并发编程,就不得不聊聊CAS(Compare And Swap)和AQS了(AbstractQueuedSynchronizer)。

单例模式

因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计。

synchronized(Java升级计划2)

synchronized原理 为什么会出现脏读呢? 当两个线程同时对一个共享数据进行操作的时候,如下图: 会把内存中的x=1读到工作空间,然后进行+1,这个时候就有一个CPU的时间片轮询的情况。当线程1进行执行的时候,读取x=1到工作空间,然后+1,刚好CPU轮询的时间到了,此时线程1中x=2的结果还没有刷新到内存中,导致线程2读取的数据是线程1更改数值之前的,出现脏读。 这里还有一种情况是,如果内存中的x=1是static修饰的,那么会出现跳号的情况,比如:线程1拿到x+1,此时x已经改为2了,但是没有输出,然后时间片轮询线程2执行,线程2拿到的值就是2了 当一段代码块被synchronized修饰的时候,那段代码被一个线程执行时,要么全部执行,要么都不执行,当执行到一半的时候,另一个线程进行访问,就会等待这个线程执行完成后再切换。此时synchronized具有的特性:独占性,排他性,可见性,原子性 为什么具有可见性呢?因为对于线程1中修改的值,线程2要能够感知到线程1把synchronized所包含的变量给修改了,此时对于线程2来说就具有可见性 synchronized (....