java内存模型是什么?
    java内存模型其实就是内存一致性模型,并发编程的bug源头一般来自于可见性,原子性,有序性三个原因,可见性问题就是缓存一致性问题,原子性(就是cpu的时间片在线程间轮换的问题),有序性是由于处理器优化和编译优化产生的问题,最暴力的解决方式就是禁用他们,但是这样会对我们程序的性能造成很大的影响,所以java内存模型提出了一套规范来按需禁用缓存和编译优化,来保证java程序在各个平台下对内存的访问达到一致的效果,主要是包括volatile,synchronized,final这几个关键字和happens-before六项原则(来规定JVM的线程工作内存何时和主存做数据同步)

    那你说说这几个关键字具体和内存模型具体联系在哪?
    synchronized与可见性?
    happens-bofore中有一项原则就行对一个对象的解锁happens-before对一个变量的加锁,所以解锁之前的操作对加锁的线程来说是可见的
    synchronized与有序性?
    被synchronized修饰的方法在同一时间只能被同一线程访问,而编译器和优化器的指令重排遵守了as-if-serial语义,不会改变单线程下的执行结果
    synchronized与原子性?
    synchronized通过moniterenter和moniterexit来进行加锁解锁操作,只要没有解锁,synchronized修饰的方法和代码块就不能被其他线程侵入,也就实现了原子性(而不是事物的那种原子性,因为他异常不能回滚)