Synchronized是具备同步性与可见性的,那么什么是同步性与可见性呢?java
(1)同步性:同步性就是一个事物要么一块儿成功,要么一块儿失败,可谓是有福同享有难同当,就像A有10000去银行转5000给身无分文的B,这个事物有两个操做,1.A扣去5000 即剩下10000-5000=5000;2.B增长0+5000=5000;一块儿成功的状况就是1和2都成功执行,一块儿失败的状况是,若是A扣除的时候机器恰好坏了,那么事物就应该回滚,否则A就只剩5000,B仍是0;这里没写例子ide
(2).可见性:就是一个线程的操做能够及时被其余线程更新到;要作到线程可见性必须知足两个条件,这里要谈到JMM(java memory model),1.线程的工做内存副本的共享变量要更新到主存,2.其余线程要及时读取主存的共享变量学习
为了更好理解 我截了个图 this
如下代码例子 是为了说明可见性的 是没有增长Synchronized 关键字 因此运行结果会出现 线程
result的值为0 或者 result的值为50blog
你们应该会疑问为何会出现50? 这是否是表明没有加Synchronized 也能够实现可见性 ,其实没有加Synchronized 并不表明就必定不会出现可见性,只是几率事件事件
package cs.util; public class SynchronizedDemo { private boolean start=false; private int result=0; private int count=0; //读操做 public void write() { start=true; count=10; } //写操做 public void read() { if(start) { result=count*5; } System.out.println("result的值为"+result); } class ReadWriteThread extends Thread { private boolean state=false; public ReadWriteThread(boolean state) { this.state=state; } @Override public void run() { // TODO Auto-generated method stub if(state) { write(); } else { read(); } } } public static void main(String[] args) { SynchronizedDemo demo=new SynchronizedDemo(); demo.new ReadWriteThread(true).start(); demo.new ReadWriteThread(false).start(); } }
若是要每次都实现 result的值为50 怎么办呢? 很简单 就修改两处地方内存
//读操做 public synchronized void write() { start=true; count=10; } //写操做 public synchronized void read() { if(start) { result=count*5; }
这只保证了可见性,咱们还要保证先写后读 还要改一个就是同步
public static void main(String[] args) { SynchronizedDemo demo=new SynchronizedDemo(); demo.new ReadWriteThread(true ).start(); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //休眠一下,不要让下面的读操做太快执行 demo.new ReadWriteThread(false).start(); }
那么每次运行结果都会输出 result的值为50 若是以为有收获就点击 推荐,让更多人快速学习,不懂也能够私信我免费交流it