“同步”是什么意思?
我对关键字的用法和意义有一些疑问。synchronized
- 关键字的意义是什么?
synchronized
- 方法应该什么时候?
synchronized
- 它在程序化和逻辑上意味着什么?
我对关键字的用法和意义有一些疑问。synchronized
synchronized
synchronized
关键字是关于读取和写入相同变量,对象和资源的不同线程。这在Java中不是一个微不足道的话题,但这里有一句来自Sun的话:synchronized
synchronized
方法支持一种防止线程干扰和内存一致性错误的简单策略:如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成的。
简而言之:非常非常小:当您有两个线程正在读取和写入相同的“资源”时,例如一个名为 的变量,您需要确保这些线程以原子方式访问该变量。如果没有关键字,线程 1 可能不会看到线程 2 所做的更改,或者更糟糕的是,它可能只更改了一半。这不会是你逻辑上所期望的。foo
synchronized
foo
同样,这在Java中是一个不平凡的话题。要了解更多信息,请浏览SO和Interwebs上的主题::
继续探索这些主题,直到“Brian Goetz”这个名字与你大脑中的“并发”一词永久相关。
好吧,我认为我们已经有足够的理论解释,所以考虑一下这个代码
public class SOP {
public static void print(String s) {
System.out.println(s+"\n");
}
}
public class TestThread extends Thread {
String name;
TheDemo theDemo;
public TestThread(String name,TheDemo theDemo) {
this.theDemo = theDemo;
this.name = name;
start();
}
@Override
public void run() {
theDemo.test(name);
}
}
public class TheDemo {
public synchronized void test(String name) {
for(int i=0;i<10;i++) {
SOP.print(name + " :: "+i);
try{
Thread.sleep(500);
} catch (Exception e) {
SOP.print(e.getMessage());
}
}
}
public static void main(String[] args) {
TheDemo theDemo = new TheDemo();
new TestThread("THREAD 1",theDemo);
new TestThread("THREAD 2",theDemo);
new TestThread("THREAD 3",theDemo);
}
}
注意:阻止下一个线程对方法 test() 的调用,只要前一个线程的执行尚未完成。线程一次只能访问一个此方法。没有所有线程可以同时访问此方法。synchronized
synchronized
当线程调用对象的同步方法“test”(此处对象是“TheDemo”类的实例)时,它会获取该对象的锁,只要先前获取锁的线程不释放锁,任何新线程都不能调用同一对象的任何同步方法。
当调用类的任何静态同步方法时,也会发生类似的事情。线程获取与类关联的锁(在这种情况下,该类实例的任何非静态同步方法都可以由任何线程调用,因为该对象级锁仍然可用)。任何其他线程都无法调用类的任何静态同步方法,只要当前持有该锁的线程未释放类级别锁即可。
同步输出
THREAD 1 :: 0
THREAD 1 :: 1
THREAD 1 :: 2
THREAD 1 :: 3
THREAD 1 :: 4
THREAD 1 :: 5
THREAD 1 :: 6
THREAD 1 :: 7
THREAD 1 :: 8
THREAD 1 :: 9
THREAD 3 :: 0
THREAD 3 :: 1
THREAD 3 :: 2
THREAD 3 :: 3
THREAD 3 :: 4
THREAD 3 :: 5
THREAD 3 :: 6
THREAD 3 :: 7
THREAD 3 :: 8
THREAD 3 :: 9
THREAD 2 :: 0
THREAD 2 :: 1
THREAD 2 :: 2
THREAD 2 :: 3
THREAD 2 :: 4
THREAD 2 :: 5
THREAD 2 :: 6
THREAD 2 :: 7
THREAD 2 :: 8
THREAD 2 :: 9
无同步输出
THREAD 1 :: 0
THREAD 2 :: 0
THREAD 3 :: 0
THREAD 1 :: 1
THREAD 2 :: 1
THREAD 3 :: 1
THREAD 1 :: 2
THREAD 2 :: 2
THREAD 3 :: 2
THREAD 1 :: 3
THREAD 2 :: 3
THREAD 3 :: 3
THREAD 1 :: 4
THREAD 2 :: 4
THREAD 3 :: 4
THREAD 1 :: 5
THREAD 2 :: 5
THREAD 3 :: 5
THREAD 1 :: 6
THREAD 2 :: 6
THREAD 3 :: 6
THREAD 1 :: 7
THREAD 2 :: 7
THREAD 3 :: 7
THREAD 1 :: 8
THREAD 2 :: 8
THREAD 3 :: 8
THREAD 1 :: 9
THREAD 2 :: 9
THREAD 3 :: 9