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()));
}
}
}
将sleep语句移到synchronized块
之外,以便其他线程有机会访问它。否则,在释放监视器时,您将依赖于一个线程访问该方法的非常小的机会窗口。
另一种方法是让您的睡眠
保持原位,但将持续时间从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);
}
}
问题内容: 我知道静态方法在类级别。因此,我知道我不需要创建实例来调用静态方法。但我也知道我可以将静态方法(如LIKE)称为实例方法。这是我感到困惑的地方,因为我期望从null对象调用静态方法(就像在调用实例方法中一样)。我真的很感谢一些解释,为什么我错了一个期望。 这是示例代码: 问题答案: 通过实例调用静态方法不需要实例存在。只要编译器能够确定变量的类型,它就可以在评估表达式并丢弃结果后静态进
问题内容: 我正在编写一个简单的项目,一个使用Swing编写的业务应用程序,它使用Hibernate作为后端。我来自Spring,这为我提供了使用hibernate和事务的简便方法。无论如何,我设法让Hibernate工作。昨天,在编写一些代码从数据库中删除bean的同时,我得到了以下信息: 删除代码很简单: 我的是: 其他详细信息:仅在关闭应用程序时,我才会在代码中关闭hibernate会话。这
问题内容: 以下简单的Java代码: 使用14个线程运行。我知道在后台运行一些GC线程,但是其他线程又有什么用?为什么会有这么多线程?我在使用Java 1.6.0_26的Gentoo Linux上。使用Eclipse的编译器或javac进行编译没有任何区别(在Eclipse的调试模式下运行它会增加3个线程,但这可能是合理的)。 问题答案: 默认情况下,我的JVM(1.6.0_26)产生更多线程。大
我正在尝试获取href的值,因为我需要在查询字符串中传递一个变量 我必须打开一个弹出窗口,其中“MySecondPage”应该以查询字符串中的值打开,但这个.href返回空值,我不知道为什么它不能工作,就像它在itemtemplate(gridview)中工作一样,我使用了table并用angularJS Repeat。 这是我的弹出功能:
不过,我可以在01:00的视频中复制问题。这意味着当我安装带有身份验证的Laravel时,如果我在登录表单中单击提交按钮两次,Firefox将发送2个请求。 为什么在多次单击按钮时,Firefox有时发送多个请求,而有时只发送一个? 我有一个用户表 如果我在按钮上单击两次(或二十次)提交表单,那么数据库中只有一个新行。 为什么会这样?我希望,如果我多次单击submit按钮,那么表单将发送多个请求,
我第一次制作Spring靴。我使用的是Spring启动版本2.3.4。我也使用后格雷SQL。我想创建两个表:玩家和团队。球队应该有一个球员名单。 所以我创建了下面两个实体类: 和 您可能已经知道,Spring boot会自动创建表格。团队表没有球员列的问题。 这里怎么了?也许我不需要看到球队表中的球员栏?(这对我来说很奇怪……)有没有更好的方法来定义值列表或数组? 此外,我想了解:是否定义了玩家团