目录

T の weblog

标签: synchronized (1)

synchronized(Java升级计划2)

synchronized原理 为什么会出现脏读呢? 当两个线程同时对一个共享数据进行操作的时候,如下图: 会把内存中的x=1读到工作空间,然后进行+1,这个时候就有一个CPU的时间片轮询的情况。当线程1进行执行的时候,读取x=1到工作空间,然后+1,刚好CPU轮询的时间到了,此时线程1中x=2的结果还没有刷新到内存中,导致线程2读取的数据是线程1更改数值之前的,出现脏读。 这里还有一种情况是,如果内存中的x=1是static修饰的,那么会出现跳号的情况,比如:线程1拿到x+1,此时x已经改为2了,但是没有输出,然后时间片轮询线程2执行,线程2拿到的值就是2了 当一段代码块被synchronized修饰的时候,那段代码被一个线程执行时,要么全部执行,要么都不执行,当执行到一半的时候,另一个线程进行访问,就会等待这个线程执行完成后再切换。此时synchronized具有的特性:独占性,排他性,可见性,原子性 为什么具有可见性呢?因为对于线程1中修改的值,线程2要能够感知到线程1把synchronized所包含的变量给修改了,此时对于线程2来说就具有可见性 synchronized (....