volatile 和 serialVersionUID

本文详细解释了Java中的volatile关键字如何确保多线程环境下成员变量的一致性读取和更新,以及serialVersionUID在对象序列化过程中的作用,防止因类版本变化导致的反序列化错误。
[size=medium]
[b]volatile(不稳定的)[/b]
volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。

这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。

而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。

使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。

由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。

[b]serialVersionUID[/b]
在序列化对象的时候,JVM会默认生成一个 serialVersionUID, 如果一个类后来的版本发生了变化,比如说,添加了一个字段,那么反序列旧版本的对象比较 serialVersionUID 时会发生错误。如果编程时强制指定了serialVersionUID, 那么序列化时会使用这个UID,反序列化时也用它,这样就不会出错了。
[/size]
private static final long serialVersionUID = 1L; private static final Log LOG = LogFactory.getLog(DruidAbstractDataSource.class); public static final int DEFAULT_INITIAL_SIZE = 0; public static final int DEFAULT_MAX_ACTIVE_SIZE = 8; public static final int DEFAULT_MAX_IDLE = 8; public static final int DEFAULT_MIN_IDLE = 0; public static final int DEFAULT_MAX_WAIT = -1; public static final String DEFAULT_VALIDATION_QUERY = null; public static final boolean DEFAULT_TEST_ON_BORROW = false; public static final boolean DEFAULT_TEST_ON_RETURN = false; public static final boolean DEFAULT_WHILE_IDLE = true; public static final long DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS = 60000L; public static final long DEFAULT_TIME_BETWEEN_CONNECT_ERROR_MILLIS = 500L; public static final int DEFAULT_NUM_TESTS_PER_EVICTION_RUN = 3; public static final int DEFAULT_TIME_CONNECT_TIMEOUT_MILLIS = 10000; public static final int DEFAULT_TIME_SOCKET_TIMEOUT_MILLIS = 10000; public static final long DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS = 1800000L; public static final long DEFAULT_MAX_EVICTABLE_IDLE_TIME_MILLIS = 25200000L; public static final long DEFAULT_PHY_TIMEOUT_MILLIS = -1L; protected volatile boolean defaultAutoCommit = true; protected volatile Boolean defaultReadOnly; protected volatile Integer defaultTransactionIsolation; protected volatile String defaultCatalog; protected String name; protected volatile String username; protected volatile String password; protected volatile String jdbcUrl; protected volatile String driverClass; protected volatile ClassLoader driverClassLoader; protected volatile Properties connectProperties = new Properties(); protected volatile PasswordCallback passwordCallback; protected volatile NameCallback userCallback; protected volatile int initialSize = 0; protected volatile int maxActive = 8; protected volatile int minIdle = 0; protected volatile int maxIdle = 8; protected volatile long maxWait = -1L; protected int notFullTimeoutRetryCount; protected volatile String validationQuery; protected volatile int validationQueryTimeout; protected volatile boolean testOnBorrow; protected volatile boolean testOnReturn; protected volatile boolean testWhileIdle; protected volatile boolean poolPreparedStatements; protected volatile boolean sharePreparedStatements; protected volatile int maxPoolPreparedStatementPerConnectionSize; protected volatile boolean inited; protected volatile boolean initExceptionThrow; protected PrintWriter logWriter; protected List<Filter> filters; private boolean clearFiltersEnable; protected volatile ExceptionSorter exceptionSorter; protected Driver driver; protected volatile int connectTimeout; protected volatile int socketTimeout; private volatile String connectTimeoutStr; private volatile String socketTimeoutStr; protected volatile int queryTimeout; protected volatile int transactionQueryTimeout; protected long createTimespan; protected volatile int maxWaitThreadCount; protected volatile boolean accessToUnderlyingConnectionAllowed; protected volatile long timeBetweenEvictionRunsMillis; protected volatile int numTestsPerEvictionRun; protected volatile long minEvictableIdleTimeMillis; protected volatile long maxEvictableIdleTimeMillis; protected volatile long keepAliveBetweenTimeMillis; protected volatile long phyTimeoutMillis; protected volatile long phyMaxUseCount; protected volatile boolean removeAbandoned; protected volatile long removeAbandonedTimeoutMillis; protected volatile boolean logAbandoned; protected volatile int maxOpenPreparedStatements; protected volatile List<String> connectionInitSqls; protected volatile String dbTypeName; protected volatile long timeBetweenConnectErrorMillis; protected volatile ValidConnectionChecker validConnectionChecker; protected volatile boolean usePingMethod; protected final Map<DruidPooledConnection, Object> activeConnections; protected static final Object PRESENT = new Object(); protected long id; protected int connectionErrorRetryAttempts; protected boolean breakAfterAcquireFailure; protected long transactionThresholdMillis; protected final Date createdTime; protected Date initedTime; protected volatile long errorCount; protected volatile long dupCloseCount; protected volatile long startTransactionCount; protected volatile long commitCount; protected volatile long rollbackCount; protected volatile long cachedPreparedStatementHitCount; protected volatile long preparedStatementCount; protected volatile long closedPreparedStatementCount; protected volatile long cachedPreparedStatementCount; protected volatile long cachedPreparedStatementDeleteCount; protected volatile long cachedPreparedStatementMissCount; private volatile FilterChainImpl filterChain;我要实现80%以下cup利用率可以修改哪些参数是有效的
11-19
【无人机】基于改进粒子群算法的无人机路径规划研究[遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值