目录
synchronized 关键字
关键字 volatile
synchronized 关键字
synchronized 关键字锁住方法和 this 的不同之处:
- public synchronized void MyMethod() {
- /**
- * 1 注意, 如果 synchronized 的是 TestClass.class, 那么任何 new 出来的该类的实例都会被阻塞, 该方法对于该类的所有实例都是一个临界区
- * 2 如果 synchronized 的是 this, 那么只是针对于一个类的具体实例来说, 并不是所有的
- * 3 如果在方法命名处, 即: public synchronized void MyMethod(), 那么等效于 2
- */
- //synchronized (this) {
- try {
- Thread.sleep(10 * 1000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- //}
- }
关键字 volatile
? 注意, 对于 volatile,Java 只保证访问该变量的时候, 访问的是最新的 (即直接访问的内存, 而不是拷贝), 但是并不保证原子性, 但是其也有可能出现脏数据, 因为如果使用 value++ 或者 value += 1 的操作 (这些操作均依赖于 volatile 变量的上一次的值, 因为这些操作都不是原子操作), 有可能会出现脏数据 volatile 的另外一个作用是禁止指令的重排序优化. 在一般情况下, Java 执行语句的顺序可能会因为自动优化而修改, 详情见: 该博客
来源: http://www.bubuko.com/infodetail-3023769.html