基本概念:
1、可视性: 即线程之间的可见性。一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果。另一个线程马上就能看到。(volatile关键字确保了应用中的可视性。如果把一个域声明为volatile的,那么只要对这个域产生了写操作,那么所有的读操作就都可以看到这个修改。即使使用了本地缓存,事实上:volatile域会立即被写入到主存中。)
2、原子性操作:不能被线程调度机制中断的操作;一旦操作开始,那么它一定可以在可能发生的“上下文切换”之前执行完毕。
3、临界区:有时,你只是希望防止多个线程同事访问方法内部的部分代码而不是访问整个方法。通过这种方式分离出来的代码段被称为临界区。(使用synchronized关键字)
4、线程本地存储:是一种自动化机制,可以为使用相同变量的每个不同的线程都创建不同的存储,这个可以根除对变量的共享。(由ThreadLocal实现 P690)
小知识点 :
1、synchronized块必须给定一个在其上进行同步的对象,并且最合理的方式是:使用其方法正在被调用的当前对象:synchronized(this)。
问题:
1、非volatile域上的原子操作不必刷新到主存中,因此其他读取该域的任务也不必看到这个新值。那么,java中有哪些方法可以保证可视性?即操作完马上刷新到主存?
2、volatile VS synchronized
3、volatile无法工作的场景
4、为什么对域中的值做赋值和返回操作通常都是原子性的?
5、Java内存模型
6、实际上,读取和写入都是直接针对内存的,而却没有被缓存。(java里面cache和主存一致性问题如何解决?)
7、synchronized,lock,临界区对于多线程的效率的高低
1、可视性: 即线程之间的可见性。一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果。另一个线程马上就能看到。(volatile关键字确保了应用中的可视性。如果把一个域声明为volatile的,那么只要对这个域产生了写操作,那么所有的读操作就都可以看到这个修改。即使使用了本地缓存,事实上:volatile域会立即被写入到主存中。)
2、原子性操作:不能被线程调度机制中断的操作;一旦操作开始,那么它一定可以在可能发生的“上下文切换”之前执行完毕。
3、临界区:有时,你只是希望防止多个线程同事访问方法内部的部分代码而不是访问整个方法。通过这种方式分离出来的代码段被称为临界区。(使用synchronized关键字)
4、线程本地存储:是一种自动化机制,可以为使用相同变量的每个不同的线程都创建不同的存储,这个可以根除对变量的共享。(由ThreadLocal实现 P690)
小知识点 :
1、synchronized块必须给定一个在其上进行同步的对象,并且最合理的方式是:使用其方法正在被调用的当前对象:synchronized(this)。
问题:
1、非volatile域上的原子操作不必刷新到主存中,因此其他读取该域的任务也不必看到这个新值。那么,java中有哪些方法可以保证可视性?即操作完马上刷新到主存?
2、volatile VS synchronized
3、volatile无法工作的场景
4、为什么对域中的值做赋值和返回操作通常都是原子性的?
5、Java内存模型
6、实际上,读取和写入都是直接针对内存的,而却没有被缓存。(java里面cache和主存一致性问题如何解决?)
7、synchronized,lock,临界区对于多线程的效率的高低