澳门银河电子

首页 > 正文

Java高级编程基础:彻底理解synchronized线程同步选择和实现

www.btsolar.com2019-08-19
Java高级编程基础:彻底理解synchronized线程同步选择和实现

我们说上面的代码是ClassLoader/JVM一级的同步。从Java数据类型的作用范围来讲,只有在由同一个类加载器加载的类在一个JVM中才是唯一的。如果我们使用多个类加载器加载类StaticSync,那么静态变量将不止存在一个实例。但是在大多数日常应用程序中,不会有多个类加载器同时加载同一个类两次,因此可以假设静态变量只存在一次,同一个JVM中的所有线程都必须在守门人处等待,直到它们获得锁进入。

我们在Java编程过程中如何选择使用同步呢?

首先,这种情况主要考虑的是共享的可变数据的操作,对于不可变数据不存在争用的竞态条件。对于可变的共享数据,我们需要识别其操作步骤和区域,由于同步锁定对于性能带来一定的影响,所以要尽量的缩小被synchronized同步管理的范围,以降低这种影响。

其次,我们在选择是锁定类,实例变量,修饰方法还是静态成员变量时,主要是根据我们要操作的数据类型和锁定的作用域来考虑作出选择的。如果我们操作的是静态的成员变量,由于其存在于类级别,所以可以考虑目标类的Class或者定义一个static的成员变量用于锁定。如果需要同步锁定的是一个实例方法的代码块,则需要定义一个实例成员变量来用作锁定变量。如果我们需要同步的是整个实例方法,那么我们可以选择将synchronized关键字直接用来修饰该方法签名。

总之对于线程的同步关键字synchronized的使用来说,要根据我们开发过程中需要同步操作的内容以及其作用域来进行选择。

热门浏览
热门排行榜
热门标签
日期归档