在 Java 中,在多线程情况下更改/读取字符串

格兰利威1986

背景

我的系统使用访问令牌来访问平台 API。

我有一个线程 A 每 2 分钟更新一次访问令牌。

然后处理前端请求的其他线程将使用访问令牌进行 API 调用。

提供访问令牌的平台本身已经实现了一些令牌重叠机制。也就是说,在生成新令牌后的 30 秒内,旧令牌仍然可用。

想法

我有一个如下所示的界面:

public interface AccessTokenService {

    String fetchAccessToken();

    void refreshAccessToken();
}

显然,处理它的最简单且无错误的方法是使这两种方法同步。但是,由于代币提供平台内置了代币重叠。我认为不需要“同步”来使其业务正常。另外,由于我的系统高度依赖API调用,使方法同步会导致性能下降。

问题

我的问题是,在底层,JVM 如何处理多线程字符串写入/读取。

比如说,一个字符串 accessToken 正在从“abc”更改为“def”。同时,一些线程正在尝试读取 accessToken 的值。读取的可能输出是什么?

  • abc(可能)
  • 定义(可能)
  • 数据库(?)
  • 更改之间的杂乱内容(?)
  • 空值 (?)
托马斯原告

由于 java 中的字符串是不可变的,因此您的阅读线程只能获取旧令牌或新令牌,而不能将某些东西混合在一起。

对引用的更新总是原子的(这里也是:您的阅读线程可以读取旧引用或新引用,但不能混合在一起)。

只有一点需要注意:存储当前令牌的字段必须声明为volatile,否则读取线程可能会缓存它们看到的某些值。

您的 AccessTokenService 的虚拟实现可能如下所示:

public class DummyAccessTokenService implements AccessTokenService {

    private volatile String currentToken = null;

    @Override
    public String fetchAccessToken() {
        return currentToken;
    }

    private int tokenNumber = 0;

    @Override
    public void refreshAccessToken() {
        currentToken = String.format("Token-%d", tokenNumber++);
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在不使用任何字符串函数的情况下从java中的字符串制作子字符串

来自分类Dev

Java按元素读取字符串中的元素

来自分类Dev

Java从文本(txt)文件中读取字符串

来自分类Dev

如何在不使用Java中的Replace()的情况下替换字符串中的char?

来自分类Dev

android java中的字符串中没有空格的情况下拆分

来自分类Dev

在不打印null的情况下,打印出数组中的字符串,Java

来自分类Dev

如何在不使用.replace的情况下替换Java字符串中的单词

来自分类Dev

如何在不使用js的情况下将java中的json字符串化

来自分类Dev

从Java中的行读取字符串-StringIndexOutOfBoundsException:字符串索引超出范围

来自分类Dev

如何在不使用split和stringtokenizer的情况下反转Java中字符串中的单词

来自分类Dev

在Java中,如何在不使用方括号中的定界符的情况下拆分字符串?

来自分类Dev

如何在Java中读取字符串中的字符

来自分类Dev

如何在Java中读取字符串中的特殊字符

来自分类Dev

在没有Java 7的情况下,如何在regex字符串中匹配大于\ uFFFF的Unicode代码点?

来自分类Dev

Java-如何在不使用数组的情况下显示String中的所有子字符串

来自分类Dev

在没有Java 7的情况下,如何在regex字符串中匹配大于\ uFFFF的Unicode代码点?

来自分类Dev

如何在Java中定义字符串数组并在切换情况下使用它

来自分类Dev

在没有 getline 的情况下,在 C++ 中读取字符串直到换行

来自分类Dev

在不更改代码的情况下中断在Java进程中运行的挂起线程的命令

来自分类Dev

java中如何读取字符串然后保存到数组中

来自分类Dev

用空格java读取字符串

来自分类Dev

如何从Java类读取字符串?

来自分类Dev

如何在不丢失Java单词的情况下拆分字符串?

来自分类Dev

Java:是否可以在不将其字符串化的情况下输出数组?

来自分类Dev

如何在不打开Java连接的情况下获取连接字符串?

来自分类Dev

Java:在这种情况下如何解析字符串?

来自分类Dev

java - 如何在没有任何for循环的情况下制作字符串替换程序?

来自分类Dev

从Java中的字符串中提取字符

来自分类Dev

如何在没有任何内置函数的情况下从Java中的两个字符串中删除重复的字母?

Related 相关文章

  1. 1

    在不使用任何字符串函数的情况下从java中的字符串制作子字符串

  2. 2

    Java按元素读取字符串中的元素

  3. 3

    Java从文本(txt)文件中读取字符串

  4. 4

    如何在不使用Java中的Replace()的情况下替换字符串中的char?

  5. 5

    android java中的字符串中没有空格的情况下拆分

  6. 6

    在不打印null的情况下,打印出数组中的字符串,Java

  7. 7

    如何在不使用.replace的情况下替换Java字符串中的单词

  8. 8

    如何在不使用js的情况下将java中的json字符串化

  9. 9

    从Java中的行读取字符串-StringIndexOutOfBoundsException:字符串索引超出范围

  10. 10

    如何在不使用split和stringtokenizer的情况下反转Java中字符串中的单词

  11. 11

    在Java中,如何在不使用方括号中的定界符的情况下拆分字符串?

  12. 12

    如何在Java中读取字符串中的字符

  13. 13

    如何在Java中读取字符串中的特殊字符

  14. 14

    在没有Java 7的情况下,如何在regex字符串中匹配大于\ uFFFF的Unicode代码点?

  15. 15

    Java-如何在不使用数组的情况下显示String中的所有子字符串

  16. 16

    在没有Java 7的情况下,如何在regex字符串中匹配大于\ uFFFF的Unicode代码点?

  17. 17

    如何在Java中定义字符串数组并在切换情况下使用它

  18. 18

    在没有 getline 的情况下,在 C++ 中读取字符串直到换行

  19. 19

    在不更改代码的情况下中断在Java进程中运行的挂起线程的命令

  20. 20

    java中如何读取字符串然后保存到数组中

  21. 21

    用空格java读取字符串

  22. 22

    如何从Java类读取字符串?

  23. 23

    如何在不丢失Java单词的情况下拆分字符串?

  24. 24

    Java:是否可以在不将其字符串化的情况下输出数组?

  25. 25

    如何在不打开Java连接的情况下获取连接字符串?

  26. 26

    Java:在这种情况下如何解析字符串?

  27. 27

    java - 如何在没有任何for循环的情况下制作字符串替换程序?

  28. 28

    从Java中的字符串中提取字符

  29. 29

    如何在没有任何内置函数的情况下从Java中的两个字符串中删除重复的字母?

热门标签

归档