文章转Hollis博客 你们能够关注下,不少技术类型的文章html
在再有人问你Java内存模型是什么,就把这篇文章发给他。中咱们曾经介绍过,Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,提供了一系列和并发处理相关的关键字,好比synchronized
、volatile
、final
、concurren包
等。java
在《深刻理解Java虚拟机》中,有这样一段话:程序员
synchronized
关键字在须要原子性、可见性和有序性这三种特性的时候均可以做为其中一种解决方案,看起来是“万能”的。的确,大部分并发控制操做都能使用synchronized来完成。算法
海明威在他的《午后之死》说过的:“冰山运动之雄伟壮观,是由于他只有八分之一在水面上。”对于程序员来讲,synchronized
只是个关键字而已,用起来很简单。之因此咱们能够在处理多线程问题时能够不用考虑太多,就是由于这个关键字帮咱们屏蔽了不少细节。编程
那么,本文就围绕synchronized
展开,主要介绍synchronized
的用法、synchronized
的原理,以及synchronized
是如何提供原子性、可见性和有序性保障的等。多线程
synchronized
是Java提供的一个并发控制的关键字。主要有两种用法,分别是同步方法和同步代码块。也就是说,synchronized
既能够修饰方法也能够修饰代码块。并发
/** * @author Hollis 18/08/04. */ public class SynchronizedDemo { //同步方法 public synchronized void doSth(){ System.out.println("Hello World"); } //同步代码块 public void doSth1(){ synchronized (SynchronizedDemo.class){ System.out.println("Hello World"); } } }
被synchronized
修饰的代码块及方法,在同一时间,只能被单个线程访问。oracle
synchronized
,是Java中用于解决并发状况下数据同步访问的一个很重要的关键字。当咱们想要保证一个共享资源在同一时间只会被一个线程访问到时,咱们能够在代码中使用synchronized
关键字对类或者对象加锁。jvm
在深刻理解多线程(一)——Synchronized的实现原理中我曾经介绍过其实现原理,为了保证知识的完整性,这里再简单介绍一下,详细的内容请去原文阅读。优化
咱们对上面的代码进行反编译,能够获得以下代码:
public synchronized void doSth(); descriptor: ()V flags: ACC_PUBLIC, ACC_SYNCHRONIZED Code: stack=2, locals=1, args_size=1 0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3 // String Hello World 5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return public void doSth1(); descriptor: ()V flags: ACC_PUBLIC Code: stack=2, locals=3, args_size=1 0: ldc #5 // class com/hollis/SynchronizedTest 2: dup 3: astore_1 4: monitorenter 5: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 8: ldc #3 // String Hello World 10: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 13: aload_1 14: monitorexit 15: goto 23 18: astore_2 19: aload_1