- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经阅读了有关线程交错和 Java 线程调度的文章,但我不明白为什么我的两个简单的 Java 线程(针对独占资源运行)在某种程度上不能交错访问资源。
在下面的代码中,我有一个 Resource 类,其唯一的静态 access() 方法包含一个同步块(synchronized block)。我只是在 main 中创建并启动两个 MyThread 实例,每个线程循环重复调用 Resource.access()。每次访问都会 hibernate 1 秒,然后释放资源。
public class X {
public static void main(String[] args) {
System.out.println("Creating threads");
Thread t1 = (new Thread(new MyThread()));
System.out.println(String.format("Thread t1 id = %d",
t1.getId()));
Thread t2 = (new Thread(new MyThread()));
System.out.println(String.format("Thread t2 id = %d",
t2.getId()));
System.out.println("Starting threads");
t1.start();
t2.start();
}
}
class MyThread implements Runnable {
@Override
public void run () {
for (int i = 0; i <= 5; i++) {
Resource.access();
}
System.out.println(String.format("Thread %d completed",
Thread.currentThread().getId()));
}
}
class Resource {
private static Object monitor = new Object();
public static void access() {
synchronized (monitor) {
System.out.println(String.format(
"Thread %d accessing resource",
Thread.currentThread().getId()));
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
ie.printStackTrace();
System.exit(1);
}
System.out.println(String.format(
"Thread %d leaving resource",
Thread.currentThread().getId()));
}
}
}
然而,无论我尝试什么,MyThread 实例的循环首先开始(上例中的 t1)在另一个 MyThread 实例(上例中的 t2)获得对资源的任何访问之前完成对资源的所有访问.这是输出:
创建线程
线程 t1 id = 12
线程 t2 id = 13
启动线程
线程 12 访问资源
线程 12 离开资源
线程 12 访问资源
线程 12 离开资源
线程 12 访问资源
线程 12 离开资源
线程 12 访问资源
线程 12 离开资源
线程 12 访问资源
线程 12 离开资源
线程 12 访问资源
线程 12 离开资源
线程 13 正在访问资源
线程 12 完成
线程 13 离开资源
线程 13 正在访问资源
线程 13 离开资源
线程 13 正在访问资源
线程 13 离开资源
线程 13 正在访问资源
线程 13 离开资源
线程 13 正在访问资源
线程 13 离开资源
线程 13 正在访问资源
线程 13 离开资源
线程 13 完成
我读到普通优先级的 Java 线程可能会得到 1 秒的时间片,所以我希望上面的线程 13 (t2) 对资源有交错访问,不一定一对一,但有些交错.
最佳答案
将您的 sleep 语句移到 synchronized block
之外,让其他线程有机会访问它。否则,您将依赖一个非常小的机会窗口让一个线程在释放监视器时访问该方法。
另一种方法是让您的 sleep
保持原样,但将持续时间从 1000 毫秒更改为 100 毫秒。然后将循环次数从 5 增加到 5000。
底线是线程资源竞争并不总是像人们预期的那样表现出来。线程并不总是合作以展示成功的交互。
class Resource {
private static Object monitor = new Object();
public static void access() {
synchronized (monitor) {
System.out.println(
String.format("Thread %d accessing resource",
Thread.currentThread().getId()));
System.out.println(
String.format("Thread %d leaving resource",
Thread.currentThread().getId()));
}
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
ie.printStackTrace();
System.exit(1);
}
}
关于java - 为什么我的两个简单 Java 线程没有得到交错访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63749570/
我有两个列表,保证第一个比第二个多一个项目。我想知道创建一个新列表的最 Pythonic 方法,该列表的偶数索引值来自第一个列表,奇数索引值来自第二个列表。 # example inputs list
我正在尝试构建一个导航,它在显示菜单/导航时错开包含的列表项的外观。 我有一个汉堡符号,单击它时会呈现导航(全屏)。我现在想要一个动画,其中不同的列表项(实际链接)出现时彼此有一些延迟,顶部的是第一个
我想在 jquery 1.3 中为一系列项目制作动画,每个下一个项目在第一个动画的中途开始。换句话说,我想要一个半队列的效果。我尝试使用下面的代码,但它不起作用。有人有什么想法吗? $("h3
我按照这篇文章创建了交错布局。 No good example about RecyclerView and StaggeredGridLayoutManager in Android Docs 当我
我有一个包含数据和类的表,比如 ---------------- | DATA | Class | ---------------- | 1 | A | | 2 | A |
这个问题在这里已经有了答案: Interweaving two numpy arrays (13 个答案) 关闭 4 年前。 我正在尝试如下交错数组。 import numpy as np x =
我想创建两个输出交错的线程,如下所示 Thread1:1=>Ping! Thread2:2=>Pong! Thread1:3=>Ping! Thread1:4=>Ping! Thread2:
这个问题在这里已经有了答案: How to elegantly interleave two lists of uneven length? (9 个回答) How to interleave tw
我试图在 GridView 中显示字符串的动态列表。每个单词都是可点击的,可以选择或取消选择。我附上了 Flipboard 的屏幕截图,因为我想要完全相同的功能。 请帮助我找出要在我的应用中实现的相同
这个问题在这里已经有了答案: Merge two lists (6 个回答) 4年前关闭。 有没有办法可以合并 2 个列表 let a = ["a"; "b"; "c"] let b = ["d";
我正在尝试使用 tf.data.Dataset 来交错两个数据集,但这样做时遇到问题。给出这个简单的例子: ds0 = tf.data.Dataset() ds0 = ds0.range(0, 10,
我有一个元素数组 1 5 9(例如 a1 a2 a3) 第二个元素数组 2 4 8 (e.g. b1 b2 b3) 我希望输出为 1,2 5,4 9,8(即 a1,b1 a2,b2 a3,b3)...
我这里有解决方案代码: // Pre-condition: The fronts of two linked lists are provided. // Post-condition: A link
我有一个矩阵,我想根据下面描述的以下方案按行进行洗牌: 我们有矩阵a: import numpy as np np.random.seed(0) low = -5 high = 5 num_frame
我继承了一些在 Linux 嵌入式平台上运行的 ALSA 代码。现有的实现使用 snd_pcm_readi() 和 snd_pcm_writei() 来阻塞读取和写入。 我的任务是让它在 ARM 处理
我如何将 2 个矩阵 A、B 合并为一个,以便新矩阵 C = A 的第 1 行,然后是 B 的第 1 行,然后是 A 的第 2 行,B 的第 2 行,A 的第 3 行,行B 的 3 等等?最好没有 f
如果我像这样迭代 std::map: typedef std::map clist; clist m_connections; for (const auto itt : m_connections)
我在弄清楚 boost 图像库时遇到了一些问题。 我找不到任何关于如何使用 boost::gil 库中包含的 interleaved_view 函数的确切文档。更具体地说,我不知道原始数据应该以什么二
而不是通过编写创建对象: obj: object [ name: "Fork" id: 1020 ] 我想写一些类似... obj: something-or-another [nam
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:lan
我是一名优秀的程序员,十分优秀!