synchronized关键字的意义是什么?
什么时候应该是方法synchronized?
这是什么编程和逻辑?
Java中,“synchronized”(同步)是什么意思?什么时候应该用synchronized?
该synchronized关键字是所有不同的线程读取和写入相同的变量,对象和资源。这在Java中并不是一个简单的话题,但是这里是Sun的一句话:
synchronized 方法为防止线程干扰和内存一致性错误提供了一个简单的策略:如果一个对象对多个线程可见,则通过同步方法完成对该对象变量的所有读取或写入操作。
简而言之,当你有两个线程正在读写相同的'资源'时,比如说一个名为变量的变量foo,你需要确保这些线程以同步的方式访问变量。如果没有synchronized关键字,线程1可能看不到更改线程2 foo,或者更糟糕的是,它可能只有一半被更改。这不会是你所期望的。
“synchronized”(同步)的实例
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