线程的通信主要是通过共享数据域和对象的引用域。这种通信方法是很高效的,但同时也有可能造成两种错误:线程冲突和内存一致性异常,用来解决这种问题的工具就是synchronization这个机制。
java程序提供两个基本的Synchronized语法,Synchronized方法和Synchronized表达式;
要让一个java方法具有Synchronized性,在声明时加上Synchronized修饰符即可
public class SynchronizedCounter {
private int c = 0;
public synchronized void increment() {
c++;
}
public synchronized void decrement() {
c--;
}
public synchronized int value() {
return c;
}
}
比如counter是SynchronizedCounter的一个实例,那么它的Synchronized方法具有两个特性:
1.两个实现了Synchronized的方法就不会再交替运行;当一个对象的Synchronized方法被一个线程调用执行,那么其他的线程要执行这个对象的这个方法就会被阻塞(暂停执行)
2.当一个Synchronized存在时,就会在同一个对象为synchronize方法在后续的调用中自动建立happen-befor关系。这保证了在同一对象的状态对每个线程都是可见的。
构造方法是不能用synchronized修饰的,否则会导致语法错误。这是因为一个对象只有被构造完成之后才能让synchronized调用方法。
synchronize是最简单的方法用来解决并行问题,但是同时也会造成活跃性的问题。