java的多进程同步控制
- 当多进程以异步方式访问共享数据时,存在不安全隐患,不符合用户的预期设计。所以当一个线程访问共享数据的时候应该将其操作变成一个“原子操作”,也就说当一个线程访问共享数据时,该操作不允许被打断,即该共享数据被该线程独占。
- 在并发程序中,对多线程共享的资源或者数据称为同步资源,每个线程访问临界资源的那一段代码称为临界代码或者临界区。对于临界区需要互斥的使用,java语言利用对象的“互斥锁”机制来实现互斥操作。
在java语言中,为了保证互斥,同步资源用关键字synchronized来标识。下来我们介绍一下synchronized关键字的一些需要记忆的点。
(1)用synchronized标识同一个临界区(含对所有共享变量的操作)时,线程的synchronized代码块之间是串行执行的(原因:互斥)。
(2)若多个线程锁定的是不是同一个对象,则他们的synchronized代码块可以互相交替穿插并发执行。
(3)synchronized代码块中代码应该精简。
(4)所有的非synchronized代码块或者方法可以自由调用。
(5)一个线程在条件允许下可以拥有多个对象的互斥锁,但是一个对象的互斥锁在一个时刻只能被一个线程拥有。
(6)一旦某个线程进入临界区后,便只能等待该临界区的代码执行完之后,线程才会释放临界区,然后其他线程才能进入临界区。
(7)临界区中的共享变量应该设置为private型,因而只能用临界区中的方法来访问共享变量。锁定对象常常是this,其格式为:
synchronized(this){
}
(8)通常共享变量声明为私有静态变量。
(9)对于一个static型的方法,要么整个方法是synchronized,要么整个方法都不是synchronized。
(10)synchronized用在类声明中,表示该类的所有方法都是synchronized的。
synchronized关键字的用法如下:
- 用法1:同步语句
synchronized(object){
//临界代码
}