关于synchronized关键字的用法和意义,我有一些疑问。
synchronized关键字的意义是什么?synchronized发布于 2009-07-06 07:01:49
synchronized关键字都是关于不同线程对相同的变量、对象和资源进行读写的。在Java中,这不是一个微不足道的话题,但以下是Sun的引语:
synchronized方法支持防止线程干扰和内存一致性错误的简单策略:如果一个对象对多个线程可见,则通过同步方法对该对象的变量进行所有读或写操作。
简单地说,当您有两个线程正在读取和写入相同的“资源”(比如一个名为foo的变量)时,您需要确保这些线程以原子方式访问变量。如果没有synchronized关键字,您的线程1可能不会看到将线程2更改为foo,或者更糟糕的是,它可能只更改了一半。这不是你逻辑上所期望的。
同样,这是Java中一个重要的主题。要了解更多信息,请浏览SO和Interweb上的主题:
继续探索这些主题,直到"Brian“这个名字永久地与你大脑中的”并发“一词联系在一起。
发布于 2014-05-15 13:23:03
好吧,我想我们已经有足够的理论解释了,所以考虑一下这段代码
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);
}
}注意:只要前一个线程的执行未完成,synchronized就会阻止下一个线程对方法test()的调用。线程可以一次访问此方法。没有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发布于 2011-01-22 18:39:44
synchronized关键字防止多个线程并发访问代码块或对象。Hashtable的所有方法都是synchronized,因此一次只能执行一个线程。
当使用非synchronized结构(如HashMap )时,必须在代码中构建线程安全特性,以防止一致性错误。
https://stackoverflow.com/questions/1085709
复制相似问题