app试玩网站制作,津南房地产网站建设,贵阳网站建设宏思锐达,做分销微商城网站#xff08;1#xff09;JMM概述 #xff08;2#xff09;JMM-原子性-synchronized
java内存模型是如何保证原子性的呢#xff0c;它是通过synchroized关键字#xff0c;来达到这个目的的 第一个线程来了进入同步代码块之后#xff0c;把这个对象加上锁了#xff0c;…1JMM概述 2JMM-原子性-synchronized
java内存模型是如何保证原子性的呢它是通过synchroized关键字来达到这个目的的 第一个线程来了进入同步代码块之后把这个对象加上锁了线程2来了不能执行只有等到线程1执行完释放锁之后线程2才有机会获得锁保证 -- 指令作为一个整体来运行的 只有有个synchroized关键字的才会有monitor区
ownermonitor监视器的所有者同一个时刻只能有一个线程成为owner
EntryList排队等候区 这里呢写法是4条虚拟机指令作为一个整体来进行加锁比如说循环5w次需要执行5w次的Monitr entry指令和monitor exit指令是比较耗时的java虚拟机指令对同一个对象做monitor指令叫做锁注入显然不太好
可以这样调整代码Monitr entry指令和monitor exit指令只执行了一次不会大批量的执行指令了减少了加锁解锁的次数 3JMM-原子性-问题 他跟局部变量的i字节码是不一样的局部变量时调用iinc的指令静态变量需要把静态变量和常数放到操作数栈用iasdd完成自增他不是在局部变量的曹上直接执行的它是在操作数栈上执行的执行完之后呢吧结果存入静态变量 所谓的内存模型呢把整个内存分为了两个部分一部分叫主内存一部分叫做工作内存不要跟以前的堆栈混淆他们是在java内存结构中的说法
静态变量时在主存中的线程啊是在工作内存中的主存跟工作内存完成数据的交换getstatic需要从主存读入工作内存工作内存完成加法把结果返回到主存中去 整个操作系统线程模型它是一种抢先试 线程呢会轮流拿到CPU的使用权cpu会以时间片为单位 在时间片1交给线程一来运行时间片2交给线程二来运行 4JMM-可见性-问题 5JMM-可见性-问题解决 多个线程都由写的操作即使在变量上加了volatile也没有办法保障它的原子性volatile只适合于一个写线程多个读线程的情况 运行 1秒之后会停下来