- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习如何使用线程,我遇到了这个问题,对于给定的代码,我需要说明某个线程是否能够访问某个函数。这是代码:
public class InsideClass{}
public class SyncClass{
private InsideClass in1;
private InsideClass in2;
public SyncClass(InsideClass i, InsideClass i2){ in1 = i; in2 = i2; }
public synchronized void func1() { System.out.println("in func1"); }
public void func2() { synchronized(in1) { System.out.println("in func2"); }}
public static synchronized void func3() { System.out.println("in func3"); }
public void func4() { synchronized(in2) { System.out.println("in func4"); }}
public synchronized void func5() {
synchronized(in1) {
synchronized(in2){ System.out.println("in func5"); }}
}}
public class MyThread extends Thread{
private SyncClass sc;
public MyThread(SyncClass s) {
sc = s;
}
public void run(){
sc.func1();
sc.func2();
SyncClass.func3();
sc.func4();
sc.func5();
}
}
public class Sys {
public static void main(String[] args) {
InsideClass in1 = new InsideClass();
InsideClass in2= new InsideClass();
SyncClass s1 = new SyncClass(in1,in2);
SyncClass s2 = new SyncClass(in2,in1);
MyThread t1 = new MyThread(s1);
MyThread t2 = new MyThread(s2);
t1.start();
t2.start();
}
}
问题是这样的,假设 t1 正在执行 task(i) (i=1,2,3,4),t2 是否能够执行 func(i+1) 还是会被阻塞?解释。我写下了完整的问题以防万一不清楚。
1) 假设 t1 正在执行 func1
a) t2 能否执行 func1?
b) t2 能否执行 func2?
c) t2 能否执行 func3?
d) t2 能否执行 func4?
2) 假设 t1 正在执行 func2。
a) t2 能否执行 func2?
b) t2 能否执行 func3?
c) t2 能否执行 func4?
3) 假设 t1 正在执行 func3
a) t2 能否执行 func3?
b) t2 能否执行 func4?
4) 假设 t1 正在执行 func4
5) func5 有一个独特的实现。
a) 这种方法可以生成多少种不同的锁?指定他们是谁。
b) func5 出现的问题是什么?你会如何解决这个问题?
我不是在寻找所有这些问题的答案(即使以防万一它会很好),但我想得到一个对象的含义的解释(在这个例子中 in1/in2)在同步块(synchronized block)内,当使用这些对象 (s1,s2) 初始化 2 个其他对象时。如果 t1 正在执行同步的 func1,这对执行 func2 的尝试有何影响? (s1 和 s2 是用相同的对象初始化的事实如何影响这个问题)。
我希望我的问题足够清楚。谢谢!
最佳答案
同步
语句获取给定对象的内部锁,然后执行其主体,然后释放 锁。
Object lock = new Object();
synchronized(lock) {
...body...
}
Java Runtime Environment (JRE) 永远不允许两个线程同时获取同一个对象的内在锁。如果一个线程获取了锁,那么第二个尝试获取锁的线程将被阻塞,直到第一个线程释放锁。
重要的是要知道无论线程如何退出...body...
锁都会被释放。无论它是 return
还是 break
,它是否只是跑到最后,或者它是否抛出异常,都无关紧要。无论如何都会释放锁。
有一种快捷方式可以编写一个整个主体都同步的成员函数。
这个:
class MyClass {
synchronized void foobar(...args...) { ...body... }
}
意思和这个完全一样:
class MyClass {
void foobar(...args...) {
synchronized(this) { ...body... }
}
}
synchronized static
函数也是如此,只是它在类对象上同步。
这个:
class MyClass {
synchronized static void foobar(...args...) { ...body... }
}
意思和这个完全一样:
class MyClass {
static void foobar(...args...) {
synchronized(MyClass.class) { ...body... }
}
}
记住变量和对象之间的区别很重要。如果变量 foo
引用两个不同的对象,则两个线程可以同时进入 synchronized(foo){...}
block 两种不同的语境。 (仔细考虑您的 in1
和 in2
成员变量!)同样,两个不同的线程可以同时调用相同的 synchronized
成员函数,如果这两个线程在不同的对象上运行。 (您的示例有两个不同的 SyncClass
实例!)
关于java - 确定哪个线程获得了同步 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44606728/
查看“mysqldump -d”并看到一个键是 KEY,而不是“PRIMARY KEY”或“FOREIGN KEY” 什么是关键? 示例: CREATE TABLE IF NOT EXISTS `TA
在我开始使用 Python 的过程中尝试找出最佳编码实践。我用 Pandas 写了一个 csv 到数据框阅读器。它使用格式: dataframe = read_csv(csv_input, useco
在 Flutter 中,用一个例子可以清楚地解释什么? 我的困惑是关于 key,如下面的代码所示。 MyHomepage({Key key, this.title}) : super(key: key
我在我的 Android 应用程序中使用 GCM。要使用 GCM 服务,我们需要创建 Google API key 。因此,我为 android、服务器和浏览器 key 创建了 API key 。似乎
我想在 azure key 保管库中创建一个 secret ,该 key 将具有多个 key (例如 JSON)。 例如- { "storageAccountKey":"XXXXX", "Co
尝试通过带有 encodeforURL() 的 url 发送 key 时,我不断收到错误消息和 decodefromUrl() .代码示例如下。 这是我的入口页面: key = generateSec
是否有检查雪花变体字段中是否存在键的函数? 最佳答案 您可以使用 IS_NULL_VALUE 来查看 key 是否存在。如果键不存在,则结果将为 NULL。如果键存在,如果值为 JSON null,则
我正在尝试运行此命令: sudo apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A 但我收到一个错误: Execu
我有一个 csv 文件,我正在尝试对 row[3] 进行计数,然后将其与 row[0] 连接 row[0] row[3] 'A01' 'a' 'B02'
如何编写具有这种形式的函数: A(key, B(key, C(key, ValFactory(key)))) 其中 A、B 和 C 具有此签名: TResult GetOrAdd(string key
审查 this method我很好奇为什么它使用 Object.keys(this).map(key => (this as any)[key])? 只调用 Object.keys(this).ind
我有一个奇怪的情况。我有一个字典,self.containing_dict。使用调试器,我看到了字典的内容,并且可以看到 self 是其中的一个键。但是看看这个: >>> self in self.c
我需要在我的 Google Apps 脚本中使用 RSA-SHA256 和公钥签署消息。 我正在尝试使用 Utilities.computeRsaSha256Signature(value, key)
我是 React 的初学者开发人员,几天前我看到了一些我不理解的有趣语法。 View组件上有{...{key}},我会写成 key={key} ,它完全一样吗?你有链接或解释吗? render()
代理 key 、合成 key 和人工 key 之间有什么区别吗? 我不清楚确切的区别。 最佳答案 代理键、合成键和人工键是同义词。技术关键是另一个。它们都表示“没有商业意义的主键”。它们不同于具有超出
问题陈述:在 Web/控制台 C# 应用程序中以编程方式检索并使用存储在 Azure Key Vault 中的敏感值(例如数据库连接字符串)。 据我所知,您可以在 AAD 中注册应用,并使用其客户端
问题陈述:在 Web/控制台 C# 应用程序中以编程方式检索并使用存储在 Azure Key Vault 中的敏感值(例如数据库连接字符串)。 据我所知,您可以在 AAD 中注册应用,并使用其客户端
我正在寻找 Perl 警告的解决方案 “引用键是实验性的” 我从这样的代码中得到这个: foreach my $f (keys($normal{$nuc}{$e})) {#x, y, and z 我在
我正在为 HSM 实现 JCE 提供程序 JCE中有没有机制指定 key 生成类型例如: session key 或永久 key KeyGenerator keygen = KeyGener
我在 Facebook 上创建了一个应用程序。我已经正确添加了 keyhash 并且应用程序运行良好但是当我今天来并尝试再次运行它时它给了我这个错误。 这已经是第二次了。 Previsouly 当我收
我是一名优秀的程序员,十分优秀!