Java并发与同步
Java中并发的形式无非是多线程和多进程两种形式。这两种形式都是能够利用多核来发挥计算能力的。
先说并发:
多进程意味着同一时候执行多个JVM。这个代价通常比多线程高,每一个JVM都有自己的堆栈、都要分别载入各自的类。可是多进程的优点是“隔离性”更好,一个JVM中的程序在执行时发生问题不会对其它JVM产生非常大的影响。
而在多线程的情况下,一些致命错误可能导致整个JVM挂掉,祸及全体。多线程能够方便地共享内存中的内容,这非常方便但有时候也会造成混乱,要小心才是。
在说同步:
在Java的线程之间实现同步是非常easy的。用synchronized预就能够实现,再不济就用java.util.concurrent.locks下提供的锁。要注意的是加锁的域或者对象是否正确。以及wait()等操作是会释放synchronized锁的。
而进程间的同步就困难一些了,由于进程之间没有了synchronized这种机制来保证一个程序段或者一个对象被串行运行和訪问。一个进程在运行时,没法预支在运行当前指令和运行下一条指令之间的一刹那会发生什么。比方你创建了一个文件:
File file = new File("123"); if (file.exists()) // do something on the file
看似你是检查文件已存在。然后做了一些读写之类的操作。万无一失的样子。但实际上,在运行完exists()方法返回true之后的那一刹那,这个文件可能就被删除或者重命名了。
对于进程之外的非常多资源,都存在这种情况。这就须要通过文件锁之类的机制来保证正确的资源共享。能够通过操作系统API实现。也能够利用jdk提供的一些API,比如:
http://www.concretepage.com/java/example-filelock-java-nio-channels
https://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileLock.html