<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Dandy613的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Dandy613</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Dandy613]]></copyright><item><title><![CDATA[Java与线程安全]]></title><link>https://blog.youkuaiyun.com/Dandy613/article/details/79051796</link><guid>https://blog.youkuaiyun.com/Dandy613/article/details/79051796</guid><author>Dandy613</author><pubDate>Sat, 13 Jan 2018 15:41:02 +0800</pubDate><description><![CDATA[线程安全：当多个线程访问一个对象时，如果不用考虑这些线程在运行时环境下的调度和交替执行，也不需要进行额外的同步，或者调用方进行其他的协调操作，调用这个对象的行为都可以获得正确的结果，则该对象是线程安全的。
Java语言中的线程安全 

1. 不可变
不可变的对象一定是线程安全的，只要其被正确地创建出来。基础数据类型只要声明为final就是不可变的，对象可以通过将自己的所有带有状态的变量都声]]></description><category></category></item><item><title><![CDATA[Java与线程]]></title><link>https://blog.youkuaiyun.com/Dandy613/article/details/79050433</link><guid>https://blog.youkuaiyun.com/Dandy613/article/details/79050433</guid><author>Dandy613</author><pubDate>Sat, 13 Jan 2018 11:54:15 +0800</pubDate><description><![CDATA[线程的实现
1. 使用内核线程(Kernel-Level Thread)实现
内核线程是由操作系统内核直接支持的线程，由内核完成线程切换，通过操纵调度器进行调度，内核负责将线程任务映射到处理器上。程序并不会直接使用内核线程，而是使用其提供的高级借口，即轻量级进程(Light Weight Process)。因为LWP和KLT是1:1的关系，所以这种实现被称为一对一的线程模型。
这一实现方式的]]></description><category></category></item><item><title><![CDATA[Java先行发生（happens-before）原则]]></title><link>https://blog.youkuaiyun.com/Dandy613/article/details/79045307</link><guid>https://blog.youkuaiyun.com/Dandy613/article/details/79045307</guid><author>Dandy613</author><pubDate>Fri, 12 Jan 2018 17:22:31 +0800</pubDate><description><![CDATA[Java语言中存在一个“先行发生”原则，可以用于判断线程是否安全，数据是否存在竞争。
定义： 如果操作A先行发生于操作B，那么在操作B之前，操作A产生的影响能被操作B观察到。
Java内存模型存在以下先行发生关系，无须额外的同步操作。而不满足以下规则的两个操作，就没有顺序性保障，虚拟机可以对其进行指令重排序。
程序次序规则（Program Order Rule）：在一个线程内，按照代码顺序（]]></description><category></category></item><item><title><![CDATA[Java volatile关键字]]></title><link>https://blog.youkuaiyun.com/Dandy613/article/details/79038566</link><guid>https://blog.youkuaiyun.com/Dandy613/article/details/79038566</guid><author>Dandy613</author><pubDate>Thu, 11 Jan 2018 21:55:55 +0800</pubDate><description><![CDATA[在面试中，经常会被问到volatile关键字的作用和原理，故而整理出本篇文章进行说明。
（提示：阅读本文需要具备内存操作相关知识，可以看这里）
volatile是Java保留的一个关键字，可以用于修饰变量，有以下两个语义：
1. 保证此变量对所有线程的可见性
Java内存模型保证了对于volatile修饰的变量，load和use操作必须连续出现，assign和store操作必须连续出现。这]]></description><category></category></item><item><title><![CDATA[Java八种内存操作]]></title><link>https://blog.youkuaiyun.com/Dandy613/article/details/79038302</link><guid>https://blog.youkuaiyun.com/Dandy613/article/details/79038302</guid><author>Dandy613</author><pubDate>Thu, 11 Jan 2018 20:37:55 +0800</pubDate><description><![CDATA[对于并发环境下的线程工作内存与主内存同步实现， Java内存模型定义了8种内存操作来完成：
1. lock：主内存操作，锁定变量，标识其为线程独占的状态。
2. unlock：主内存操作，解锁变量，将其从线程独占的状态中释放出来。
3. read：主内存操作，读取变量到工作内存。
4. load：工作内存操作，将读取到的变量赋值给工作内存中的变量副本。
5. use：工作内存操作，将变量]]></description><category></category></item></channel></rss>