【问题标题】:Advices on concurrency JAVA关于并发JAVA的建议
【发布时间】:2018-11-13 23:23:11
【问题描述】:

我是并发方面的新手(我相信我在 Monitors、Semaphores 和 reentrantLocks 方面做得很好)所以我不能使用它们。 我必须使用并发包中的任何类或接口。

Point 1.- 很少有线程必须访问一个数组并对它的元素进行求和(我在这里使用了原子变量,有一个原子变量用作数组的指针)。

点 2.- 在这里,许多线程(汽车)在岸边有,要过河。有一个模拟船的线程。当船上有 10 辆汽车时,它驶向对岸。重复这种安全措施,直到所有汽车都过河。我真的不知道在这里使用哪些。

Point 3.- 在这里,一些线程必须读取一些信息,而其他线程必须修改该信息(任意次数)。我相信在这里我必须使用 ReadWriteLock。

Point 4.- 生产者/消费者之类的问题。这里我使用了 BlockingQueue。

第 5 点。- 组成一个类似问题的交换器并解决它(完成,非常简单的一个......交换字符串变量的 2 个线程)。

如果您对在某些点使用哪种方法有任何建议(例如“不,在第 3 点使用原子变量,在第 1 点使用 cyclicBarrier”),对我有很大帮助!

谢谢!

【问题讨论】:

  • 解决这个问题的更好方法是确定每个并发原语的用途,例如通过阅读它们的 Javadoc。然后,您不仅可以回答这个问题,还可以为您在职业生涯中遇到的每个并发问题选择合适的工具。
  • 我已经阅读了很多关于它的信息,但我有点迷茫。 Theacher 上周五给了我们这个项目,必须在 23 号周五交付。他们几乎没有给我们关于这门课的任何信息......我知道我必须继续阅读,但是在这个问题上任何东西都可能非常方便,呵呵

标签: java multithreading concurrency


【解决方案1】:

原子变量

原子变量通过 CAS 算法进行,它们可以被多个线程安全地使用:

CAS:

典型的 CAS 操作适用于三个操作数: 操作的内存位置 (M) 现有的预期 变量的值 (A) 需要设置的新值 (B) CAS 操作将 M 中的值原子更新到 B,但前提是 M 中的现有值与 A 匹配,否则不执行任何操作。

你可以使用 Exchanger,它可以用来交换,交换一些 两个线程之间的信息

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Exchanger.html

阻塞队列是你提到的消费者生产者模型,所以对于 使用它你需要创建两个线程一个将是生产者它将 放入阻塞队列,消费者将从中消费(读取)。 BlockingQueue的实现有很多
这里有更多 详细信息:

http://tutorials.jenkov.com/java-util-concurrent/blockingqueue.html

所以从你的名单上都是他们的地方。

您还可以在这里了解有关 java.util.concurrent 的内容 我认为这会有所帮助:

http://tutorials.jenkov.com/java-util-concurrent/index.html

【讨论】:

  • 问题是我必须使用我提到的那 5 个类
  • 所以实际上从我这边来说一切都很好,如果你有一些假设可以在免费询问时使用什么
  • 这真的很有帮助,非常感谢!我会阅读 jenkov.com 的教程!
  • 所以,老师给我们发了一封电子邮件,告诉我们可以使用并发包中的任何课程。
【解决方案2】:

第2点:如果线程是船,它应该在河的一侧装载汽车并在另一岸卸货。看起来银行上汽车的最自然表示是船上汽车的 BlockingQueue 和 ArrayList。一般来说,总是首先考虑 BlockingQueue。

第 3 点:这通常通过同步方法完成,或 ReentrantLocks

【讨论】:

  • 我不能使用可重入锁、信号量或监视器。我应该尝试另一种方法,因为我已经在生产者/消费者点上使用了 BlockingQueues。
猜你喜欢
  • 2011-04-17
  • 2011-06-01
  • 2012-05-03
  • 1970-01-01
  • 2012-07-18
  • 2020-02-22
  • 1970-01-01
  • 2019-11-30
  • 2018-09-03
相关资源
最近更新 更多