我是线程新手,目前正在学习线程同步章节。关于线程锁定中的一个场景,我有一个问题
以下是我所知道的:
1:当我在实例方法中放置实例锁时(即)
private Object lock1= new Object();
private Object lock2 = new Object();
void f1(){
synchronized (lock1) {
}
}
void f2(){
synchronized (lock2 ) {
}
}
void f4(){
synchronized (lock2 ) {
}
}
void f3(){
synchronized (lock1) {
}
}
这里将发生的情况是,如果有一个类X的对象A被多个线程共享,并且一些线程t1正在执行f1的块,那么直到t1退出f1块,所有试图进入函数f3的其他线程,f1都将被阻止。f2和f4的情况也是如此。
现在,在静态锁的情况下,如果一个类有多个静态方法,并且我们希望这些方法单独锁定,而不是类锁定,那么我们将有多个静态锁。这些锁将决定哪些方法将被阻止。
到目前为止,一切都很好。现在,如果把这个静态锁放在一个实例方法中,当同一个html" target="_blank">对象上的两个线程尝试访问该方法时,会发生什么?
在并发情况下,始终使任何字段(lock1,lock2)不稳定或最终。而且,如果同步锁上的代码块,无论静态上下文与否,一次只能通过一个线程。所以这两个线程中的一个将被阻塞,直到另一个完成。
当您在实例方法中的静态
锁上同步时,只有一个线程能够进入由该锁控制的关键部分,而不管对象的哪个实例正在使用。
如果将lock1
设置为静态,则系统范围内只有一个线程能够运行f1
或f3
,即使创建了数百个类X
实例,因为所有静态
成员(包括锁定的对象)都在类的所有实例之间共享。
通过下面的代码,我有A类的两个实例-a1和A2。并分别对这两个实例调用方法foo()。 在foo()方法中有一个synchronized块,它被锁定在调用对象上。由于这是一个实例级的锁定,这两个方法应该同时开始执行,因为它们是从两个独立的实例调用的。但是,他们被顺序执行。 这是因为,两个实例都是从同一个线程主调用的吗? 预期输出(应并行执行) 实际输出(按顺序执行)
假设我们有一个类,其中有一个实例方法和静态方法。我们用类级锁同步了静态方法中的块
我有以下代码: 到目前为止,代码还可以,但我无法在主方法中实例化'in',比如,因为它显示
Test类是超级类,Fest是它的子类,因为我们知道静态方法不能被重写,即使我遇到了“静态方法不能在java中隐藏实例方法”这样的错误,有人能解释一下吗,提前谢谢。
问题内容: 我有以下代码: 到目前为止,代码还不错,但是我无法像显示的那样在main方法中实例化 我该怎么做?我不想使我的课堂静止。 问题答案: 你还必须参考其他外部类。 如果内在是静态的,那将是
问题内容: 如果我用Java创建类的实例,为什么最好静态地调用同一类的静态方法,而不是使用this.method()? 当我尝试通过this.staticMethod()从自定义类的构造函数中调用静态方法staticMethod()时,我收到Eclipse的警告。 与 谁能解释为什么这是一件坏事?在我看来,编译器应该已经分配了对象的实例,因此静态分配内存将是不必要的开销。 编辑: 我听到的要点是,