线程同步和执行顺序
Thread synchronization and execution order
所以想象有一个 class A 像这样实现 Runnable:
class A implements Runnable {
C c;
Thread t;
public A(C c){
this.c = c;
t = new Thread(this);
}
public void start(){
t.start();
}
public void run(){
for (int i = 0; i < 5; i++){
c.doIt();
}
}
}
Class C 只包含一个同步方法,它按字符打印当前线程的详细信息,如下所示:
class C {
synchronized void doIt(){
String s = Thread.currentThread().toString();
for (int i = 0; i < s.length(); i++) {
System.out.print(s.charAt(i));
}
System.out.println();
}
}
如果我在我的 main 方法中创建 2 个线程,同时使用 class C 的共享对象 c,我不应该收到一个随机的线程执行顺序,因为只有 doIt 方法是同步的吗?我想象的方式是,在 t1 完成 doIt() 迭代后,t2 线程将能够接收控制。似乎锁被 t1 获取,直到线程的整个循环完成它的工作。所以我的问题是 - 同步是否意味着线程也必须在另一个线程启动之前完成(不仅是 doIt() 的同步)?
同步实例方法
这是一个同步实例方法:
public synchronized void add(int value){
this.count += value;
}
注意在方法声明中使用了 synchronized 关键字。这告诉 Java 该方法已同步。
Java 中的同步实例方法在拥有该方法的实例(对象)上同步。因此,每个实例都有其同步方法在不同的对象上同步:拥有实例。只有一个线程可以在同步实例方法中执行。如果存在多个实例,则一次一个线程可以在每个实例的同步实例方法内执行。每个实例一个线程。
(c) http://tutorials.jenkov.com/java-concurrency/synchronized.html
所以这意味着,在您的情况下,当第一个线程完成它对 doIt() 的第一次调用时,另一个线程可以访问该方法,但这不能保证。
所以想象有一个 class A 像这样实现 Runnable:
class A implements Runnable {
C c;
Thread t;
public A(C c){
this.c = c;
t = new Thread(this);
}
public void start(){
t.start();
}
public void run(){
for (int i = 0; i < 5; i++){
c.doIt();
}
}
}
Class C 只包含一个同步方法,它按字符打印当前线程的详细信息,如下所示:
class C {
synchronized void doIt(){
String s = Thread.currentThread().toString();
for (int i = 0; i < s.length(); i++) {
System.out.print(s.charAt(i));
}
System.out.println();
}
}
如果我在我的 main 方法中创建 2 个线程,同时使用 class C 的共享对象 c,我不应该收到一个随机的线程执行顺序,因为只有 doIt 方法是同步的吗?我想象的方式是,在 t1 完成 doIt() 迭代后,t2 线程将能够接收控制。似乎锁被 t1 获取,直到线程的整个循环完成它的工作。所以我的问题是 - 同步是否意味着线程也必须在另一个线程启动之前完成(不仅是 doIt() 的同步)?
同步实例方法 这是一个同步实例方法:
public synchronized void add(int value){
this.count += value;
}
注意在方法声明中使用了 synchronized 关键字。这告诉 Java 该方法已同步。
Java 中的同步实例方法在拥有该方法的实例(对象)上同步。因此,每个实例都有其同步方法在不同的对象上同步:拥有实例。只有一个线程可以在同步实例方法中执行。如果存在多个实例,则一次一个线程可以在每个实例的同步实例方法内执行。每个实例一个线程。 (c) http://tutorials.jenkov.com/java-concurrency/synchronized.html
所以这意味着,在您的情况下,当第一个线程完成它对 doIt() 的第一次调用时,另一个线程可以访问该方法,但这不能保证。