Java static 和 volatile 的区别
Java中的static和volatile关键字在内存模型、线程安全、性能和用途方面有所不同
区分方式 | Static | Volatile |
---|---|---|
内存模型 | 用于创建类级别的变量或方法,所有类的实例共享同一个static变量的副本。 | 用于确保一个变量在多线程环境中的可见性,使所有线程都能看到最新的变量值。 |
线程安全 | 仅通过将变量声明为static并不能确保线程安全。 | 通过保证变量的可见性,提供了一定的线程安全保障。 |
性能 | 由于所有实例共享一个变量副本,因此性能较高。 | 可能影响性能,因为每次读写都需要访问主内存。 |
用途 | 可用于变量、方法、初始化块和内部类。 | 仅用于声明变量。 |
变量类型 | 可用于变量、方法、初始化块和内部类。 | 仅用于声明变量。 |
可见性 | 不能保证工作区与主存区变量值的一致性。 | 保证每次工作内存操作前都去主存中取最新的值,解决了内存不可见性的问题。 |
具体来说,
static
关键字用于创建类级别的变量或方法,所有类的实例共享同一个static
变量的副本。这意味着对static
变量的任何修改可以立即影响所有实例,但这也意味着对static变量的任何未同步的修改可能会在不同实例之间产生不一致性。而volatile
关键字用于确保一个变量在多线程环境中的可见性,确保所有线程都能看到最新的变量值。这意味着对volatile
变量的每次写操作都会立即写回主内存,并使所有线程中的副本无效,从而保证所有线程看到的变量值是一致的。
本文作者:笔兴洽谈室 哔哩哔哩:笔兴洽谈室 GitHub:StarJava1024 Gitee:StarJava1024
本文链接:https://www.cnblogs.com/CrayonXiaoxing/articles/18105308
原创文章仅用于学习,不得修改原作品,不得再创作。若本文侵犯某版权,请私信联系删除!如需转载,请私信!