相关疑难解决方法(0)

968
推荐指数
27
解决办法
19万
查看次数

'同步'是什么意思?

我对synchronized关键字的用法和重要性有一些疑问.

  • synchronized关键字有什么意义?
  • 方法何时应该synchronized
  • 这在编程和逻辑上意味着什么?

java multithreading synchronized keyword

958
推荐指数
12
解决办法
48万
查看次数

你在Java中使用volatile关键字吗?

在今天的工作中,我遇到了volatileJava中的关键字.我不太熟悉它,我发现了这个解释:

Java理论与实践:管理波动性

鉴于该文章解释了相关关键字的详细信息,您是否使用过它,或者您是否曾经看到过以正确方式使用此关键字的情况?

java multithreading volatile keyword

628
推荐指数
13
解决办法
24万
查看次数

108
推荐指数
3
解决办法
4万
查看次数

在并发编程的上下文中,"数据竞争"和"竞争条件"实际上是相同的

我经常发现这些术语在并发编程的上下文中使用.它们是相同的还是不同的?

language-agnostic concurrency multithreading data-race

82
推荐指数
5
解决办法
2万
查看次数

指令重新排序和发生在java之前的关系

在Java Concurrency In Practice一书中,我们被告知可以通过编译器,JVM在运行时甚至由处理器重新排序程序的指令.因此,我们应该假设执行的程序不会以与我们在源代码中指定的顺序完全相同的顺序执行其指令.

但是,讨论Java内存模型的最后一章提供了一个先前发生的规则列表,指出了JVM保留了哪些指令排序.这些规则中的第一条是:

  • "程序顺序规则.线程中的每个操作都发生在程序顺序后面的该线程中的每个操作之前."

我相信"程序顺序"是指源代码.

我的问题:假设这个规则,我想知道什么指令可能实际重新排序.

"行动"定义如下:

Java内存模型是根据操作指定的,包括对变量的读取和写入,监视器的锁定和解锁,以及启动和连接线程.JMM定义了在程序中的所有操作之前调用的部分排序.为了保证执行动作B的线程可以看到动作A的结果(A和B是否出现在不同的线程中),必须在A和B之间的关系之前发生.在没有发生之前在两个之间进行排序操作,JVM可以随意重新排序.

其他提到的订单规则是:

  • 监控锁定规则.监视器锁定上的解锁发生在同一监视器锁定的每个后续锁定之前.
  • 易变变量规则.对每个后续读取同一字段之前发生对易失性字段的写入.
  • 线程启动规则.在线程上调用Thread.start会在启动线程中的每个操作之前发生.
  • 线程终止规则.线程中的任何操作都发生在任何其他线程检测到该线程已终止之前,可以通过成功从Thread.join返回,也可以通过Thread.isAlive返回false.
  • 中断规则.另一个线程上的线程调用中断发生在被中断的线程检测到中断之前(通过抛出InterruptedException,或者调用isInterrupted或中断).
  • 终结者规则.对象的构造函数的结束发生在该对象的终结器的开始之前.
  • 及物.如果A发生在B之前,B发生在C之前,那么A发生在C之前.

java concurrency multithreading java-memory-model

51
推荐指数
1
解决办法
1万
查看次数

如何在Swift中以原子方式递增变量?

我希望能够原子地增加一个计数器,我找不到任何关于如何做的参考.

根据评论添加更多信息:

  • 你在用GCD吗?不,我没有使用GDC.必须使用队列系统来增加数字似乎有点过分.
  • 您理解基本的线程安全?是的,否则我不会询问原子增量.
  • 这个变量是本地的吗?没有.
  • 它是实例级吗?是的,它应该是单个实例的一部分.

我想做这样的事情:

 class Counter {
      private var mux Mutex
      private (set) value Int
      func increment (){
          mux.lock()
          value += 1
          mux.unlock()
      }
 }
Run Code Online (Sandbox Code Playgroud)

concurrency swift

41
推荐指数
4
解决办法
2万
查看次数

内存一致性 - 发生在Java之前的关系之前

在阅读有关内存一致性错误的Java文档时.我找到了与两个创造事件相关的点 - 在关系之前:

  • 当一个语句调用时Thread.start(),与该语句有一个before-before关系的每个语句也与新线程执行的每个语句都有一个before-before关系.新线程可以看到导致创建新线程的代码的影响.

  • 当一个线程终止并导致Thread.join()另一个线程返回时,终止
    线程执行的所有语句
    与成功连接后的所有语句都有一个before-before关系.现在,执行连接的线程可以看到线程中代码的效果.

我无法理解他们的意思.如果有人用一个简单的例子解释它会很棒.

java java.util.concurrent happens-before

33
推荐指数
3
解决办法
1万
查看次数

在Java中编写long和double并不是原子的?

读取和写入单个变量是原子的(语言保证!),除非变量的类型为long或double.

我正在读一个课程的幻灯片,我发现写了.这个类是关于并发的.

任何人都可以向我解释为什么写长或双不是原子操作?这让我感到惊讶.

java concurrency

26
推荐指数
3
解决办法
9542
查看次数

哪些Java集合是同步的(线程安全),哪些不是?

哪些Java集合是同步的,哪些不是?

示例:HashSet未同步

java collections

18
推荐指数
5
解决办法
6万
查看次数