标签:设计 类型 java 多线程编程 效率 class 手动 共享变量 数据
synchronized是Java实现同步的一种机制,它属于Java中关键字,是一种jvm级别的锁。synchronized锁的创建和释放是此关键字控制的代码的开始和结束位置,锁是由jvm控制的创建和释放的,正是因为这一点,synchronized锁不需要手动释放,哪怕是代码出现异常,jvm也能自动释放锁。
在并发编程中存在线程安全问题,主要原因有:1.存在共享数据 2.多线程共同操作共享数据。关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时synchronized可以保证一个线程的变化可见(可见性),即可以代替volatile。
synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性
对于普通的同步方法:
锁是当前的对象
对于静态函数的同步方法:
锁是静态函数所在类的class对象
对于同步方法块的内容:
锁是指Synchonized括号里配置的对象
Java程序中,为了提高程序运行效率,编译器会自动对其进行优化,把经常被访问的变量缓存起来,程序在读取变量时可能直接从缓存(例如寄存器)中来读取这个值,而不会从内存中取。但当遇到多线程编程时,变量的值可能因为别的线程而改变,但是缓存的值不会相应的发生变化,从而造成应用程序读值和实际值不一样。
volatile是一个类型修饰符,被设计用来修饰被不同线程访问和修改的变量。被volatile修饰的变量,系统每次用到它都会直接从内存中提取,而不利用内存。所以被修饰的变量,所有线程线程在任何时候看到的值都是相同的。
volatile不能保证原子性,所以volatile不能代替Synchronized。而且volatile会降低程序的运行效率,所以能不用则不用。
标签:设计 类型 java 多线程编程 效率 class 手动 共享变量 数据
原文地址:https://www.cnblogs.com/programmerzx/p/12293635.html