<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ack_Finding的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/ack_Finding</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ack_Finding]]></copyright><item><title><![CDATA[CAS以及其ABA问题及解决方法]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/82526698</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/82526698</guid><author>ack_Finding</author><pubDate>Sun, 21 Apr 2019 18:49:50 +0800</pubDate><description><![CDATA[1、简述

常见的Java并发手段是加锁，但加锁、解锁操作是消耗性能的。相比起来，CAS无锁方案则没有加锁、解锁的性能消耗，还保证了互斥性，但同时也存在ABA的问题

2、CAS

CAS的语义是：将内存位置的值与预期原值比较，如果相匹配，那么处理器会自动将该位置值更新为新值，否则，处理器不做任何操作。CAS是一条CPU的原子指令（cmpxchg指令），是通过Unsafe类的方法实现的，Unsaf...]]></description><category></category></item><item><title><![CDATA[ThreadLocal]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/88065275</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/88065275</guid><author>ack_Finding</author><pubDate>Sat, 02 Mar 2019 21:59:20 +0800</pubDate><description><![CDATA[1、简介

ThreadLocal提供了一种访问某个变量的特殊方式：访问到的变量属于当前线程，即保证每个线程的变量不一样，而同一个线程在任何地方拿到的变量都是一致的，这就是所谓的线程隔离

ThreadLocalMap并不是为了解决线程安全问题，而是提供了一种将实例绑定到当前线程的机制，类似于隔离的效果，实际上自己在方法中new出来变量也能达到类似的效果。ThreadLocalMap跟线程安全基本...]]></description><category></category></item><item><title><![CDATA[《Java并发编程实战》笔记6——notify、notifyAll]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/82979006</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/82979006</guid><author>ack_Finding</author><pubDate>Wed, 10 Oct 2018 12:45:52 +0800</pubDate><description><![CDATA[ 

 

只有同时满足以下两个条件时，才能用单一的notify而不是notifyAll：
a.所有等待线程的类型都相同，只有一个条件谓词与条件队列相关，并且每个线程在从wait返回后将执行相同的操作。
b.单进单出。在条件变量上的每次通知，最多只能唤醒一个线程来执行。 ...]]></description><category></category></item><item><title><![CDATA[ReentrantLock、ReentrantReadWriteLock]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/82897224</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/82897224</guid><author>ack_Finding</author><pubDate>Mon, 08 Oct 2018 22:53:17 +0800</pubDate><description><![CDATA[一、ReentrantLock

ReentrantLock是可重入锁，已经获得锁的线程可以再次获得锁，如果一个线程获取了n个锁，那么释放的时候同样要释放n个锁。

同步组件主要是通过重写AQS的几个protected方法来表达自己的同步语义。ReentrantLock主要的方法：


   //获取锁
    public void lock() {
        sync.lock();
 ...]]></description><category></category></item><item><title><![CDATA[Lock、AbstractQueuedSynchronizer]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/81165749</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/81165749</guid><author>ack_Finding</author><pubDate>Sat, 29 Sep 2018 10:24:34 +0800</pubDate><description><![CDATA[一、Lock简介

Lock是并发访问共享资源的另一种方式，当需要使用chain lock这种时会很灵活，jdk文档中举了一个例子：（For example, some algorithms for traversing concurrently accessed data structures require the use of &quot;hand-over-hand&quot; or &quot;chain locki...]]></description><category></category></item><item><title><![CDATA[《Java并发编程实战》笔记5——性能与测试]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/82804794</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/82804794</guid><author>ack_Finding</author><pubDate>Tue, 25 Sep 2018 15:55:04 +0800</pubDate><description><![CDATA[性能与可伸缩性

1、小工具

（1）perfar：测试CPU忙碌程度信息

（2）iostat、perfmon：判断是否是I/O密集

2、单个任务的处理时间不仅包括执行任务Runnable的时间，也包括从共享队列中取出任务的时间。如果通过加锁来保护队列的状态，那么当一个线程从队列中取出任务时，其他需要获取下一个任务的线程就必须等待，这就是任务处理过程中的串行部分。

在所有的并发程序中都包含一...]]></description><category></category></item><item><title><![CDATA[《Java并发编程实战》笔记4——避免活跃性危险]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/82770435</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/82770435</guid><author>ack_Finding</author><pubDate>Fri, 21 Sep 2018 16:37:15 +0800</pubDate><description><![CDATA[1、死锁

（1）锁顺序死锁

例子：


public class LeftRightDeadlock {
    private final Object left = new Object();
    private final Object right = new Object();

    public void leftRight() {
        synchronized ...]]></description><category></category></item><item><title><![CDATA[《Java并发编程实战》笔记3——线程池的使用]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/82747039</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/82747039</guid><author>ack_Finding</author><pubDate>Wed, 19 Sep 2018 12:37:23 +0800</pubDate><description><![CDATA[1、线程饥饿死锁

在线程池中，如果任务依赖于其他任务，那么可能发生死锁。在单线程的Executor中，如果一个任务将另一个任务提交到同一个Executor，并且等待这个被提交任务的结果，那么通常会引发死锁。

如下面代码所示：


public class ThreadDeadlock {
        
	ExecutorService exec = Executors.newSingleT...]]></description><category></category></item><item><title><![CDATA[《Java并发编程实战》笔记2——取消与关闭]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/82706783</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/82706783</guid><author>ack_Finding</author><pubDate>Mon, 17 Sep 2018 18:06:31 +0800</pubDate><description><![CDATA[1、取消

（1）生产者消费者问题中，如果采用BlockingQueue阻塞队列。假如生产者生产的速度超过了消费者的处理速度，队列将被填满，put操作也会被阻塞。当生产者在put方法中阻塞时，如果消费者希望取消生产者任务，它可以通过调用cancel方法来设置cancelled标志，但此时生产者却永远不能检查这个标志，因为它无法从阻塞的方法中恢复过来（消费者已经停止从队列中取出素数，所以put方法将...]]></description><category></category></item><item><title><![CDATA[《Java并发编程实战》笔记1——Java线程安全基础]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/82526584</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/82526584</guid><author>ack_Finding</author><pubDate>Fri, 14 Sep 2018 17:13:24 +0800</pubDate><description><![CDATA[1、什么是线程安全？

多个线程访问某个类时，不管运行时环境采用何种调用方式或者这些线程将如何交替执行，并且在主调代码中不需要任何的额外的同步或协同，这个类都能表现出正确的行为，那么就称这个类是线程安全的。（摘自Java并发编程实战）

2、无状态对象一定是线程安全的。

那么，什么才称为无状态呢？有状态是指有数据存储的功能，也就是有实例变量。无状态是指不包含任何域，也不包含对其他类中域的引用。（...]]></description><category></category></item><item><title><![CDATA[Iterator源码解析及和for-each循环]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/82697195</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/82697195</guid><author>ack_Finding</author><pubDate>Fri, 14 Sep 2018 17:12:22 +0800</pubDate><description><![CDATA[在使用foreach循环遍历集合的过程中，如果集合被修改了，会抛出ConcurrentModificationException异常。

以这段代码为例子：


public class SynProblem {

	List&amp;lt;Widget&amp;gt; widgetList = Collections.synchronizedList(new ArrayList&amp;lt;&amp;gt;());
	{
	...]]></description><category></category></item><item><title><![CDATA[线程饥饿死锁]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/81160016</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/81160016</guid><author>ack_Finding</author><pubDate>Sun, 22 Jul 2018 22:51:56 +0800</pubDate><description><![CDATA[
/**
 * 线程饥饿死锁——在单线程Executor中发生死锁
 */
public class ThreaDeadLock {
        //单线程Executor
	ExecutorService exec = Executors.newSingleThreadExecutor();
	
	class RenderPageTask implements Callable&amp;lt;Str...]]></description><category></category></item><item><title><![CDATA[volatile和final]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/81065797</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/81065797</guid><author>ack_Finding</author><pubDate>Mon, 16 Jul 2018 15:42:57 +0800</pubDate><description><![CDATA[1、关于内存屏障：（摘自内存屏障）（1）LoadLoad屏障：对于这样的语句Load1; LoadLoad; Load2，在Load2及后续读取操作要读取的数据被访问前，保证Load1要读取的数据被读取完毕。（2）StoreStore屏障：对于这样的语句Store1; StoreStore; Store2，在Store2及后续写入操作执行前，保证Store1的写入操作对其它处理器可见。（3）Loa...]]></description><category></category></item><item><title><![CDATA[2. Add Two Numbers]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/80575768</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/80575768</guid><author>ack_Finding</author><pubDate>Sat, 14 Jul 2018 15:49:36 +0800</pubDate><description><![CDATA[给定两个非空链表代表两个非负整数，每位数存储在一个倒置的链表中结点，将这两个数相加，返回结果链表.你可以假设这两个数字不包含任何前导零，除了数字0本身。ExampleInput: (2 -&amp;gt; 4 -&amp;gt; 3) + (5 -&amp;gt; 6 -&amp;gt; 4)
Output: 7 -&amp;gt; 0 -&amp;gt; 8
Explanation: 342 + 465 = 807.
思路：可以看到链表翻转过...]]></description><category></category></item><item><title><![CDATA[Python模块笔记]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/81040368</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/81040368</guid><author>ack_Finding</author><pubDate>Sat, 14 Jul 2018 09:53:23 +0800</pubDate><description><![CDATA[Python 模块(Module)，是一个 Python 文件，以 .py 结尾，包含了 Python 对象定义和Python语句。1、导入模块from..import和import..区别在同一路径下新建文件now.py# -*- coding:UTF-8 -*-

Money = 2000
def AddMoney(a):
   global Money
   Money = Money + ...]]></description><category></category></item><item><title><![CDATA[CountDownLatch和CyclicBarrier]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/80980424</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/80980424</guid><author>ack_Finding</author><pubDate>Tue, 10 Jul 2018 09:28:37 +0800</pubDate><description><![CDATA[一、CountDownLatch

CountDownLatch是拦截线程等待事件发生，提供了一个countDown方法来操作计数器的值，每调用一次countDown方法计数器都会减1，直到计数器的值减为0时就代表条件已成熟，所有因调用await方法而阻塞的线程都会被唤醒。

1、下面是java源码的两个demo：

（1）


	/**
	 * 
	 * startSignal：司机准备好之前，...]]></description><category></category></item><item><title><![CDATA[Python基础笔记（实验楼笔记）]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/80867436</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/80867436</guid><author>ack_Finding</author><pubDate>Mon, 02 Jul 2018 07:54:18 +0800</pubDate><description><![CDATA[1、元组元素不可修改，列表元素可以修改不可删除元组元素，只能删除整个元组，但列表可以2、元组只有一个元素时，需要在元素后面加逗号，如：tup1 = (50,)...]]></description><category></category></item><item><title><![CDATA[使用文本编辑器编译python出现乱码问题]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/80864343</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/80864343</guid><author>ack_Finding</author><pubDate>Sat, 30 Jun 2018 10:26:02 +0800</pubDate><description><![CDATA[1、编译如下代码# -*- coding:UTF-8 -*-

print &quot;My name is %s and weight is %d kg!&quot; %('Emily',46)
print &quot;{1} {0}&quot;.format(&quot;hello&quot;,&quot;world&quot;)
print (&quot;网站名:{name},地址:{url}&quot;.format(name=&quot;知乎&quot;,url='www.zhihu.com'))]]></description><category></category></item><item><title><![CDATA[2. Add Two Numbers]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/80575790</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/80575790</guid><author>ack_Finding</author><pubDate>Thu, 07 Jun 2018 07:26:43 +0800</pubDate><description><![CDATA[给定两个非空链表代表两个非负整数，每位数存储在一个倒置的链表中结点，将这两个数相加，返回结果链表.你可以假设这两个数字不包含任何前导零，除了数字0本身。ExampleInput: (2 -&amp;gt; 4 -&amp;gt; 3) + (5 -&amp;gt; 6 -&amp;gt; 4)
Output: 7 -&amp;gt; 0 -&amp;gt; 8
Explanation: 342 + 465 = 807.
思路：可以看到链表翻转过...]]></description><category></category></item><item><title><![CDATA[1. Two Sum [SIMPLE]]]></title><link>https://blog.youkuaiyun.com/ack_Finding/article/details/80459606</link><guid>https://blog.youkuaiyun.com/ack_Finding/article/details/80459606</guid><author>ack_Finding</author><pubDate>Sat, 26 May 2018 15:17:06 +0800</pubDate><description><![CDATA[题目：给定一个整型数组，返回数组中两数相加和等于target的下标。假设每次输入只有一个结果，你不会两次都用到同一个元素。1、第一次解法：    通过创建一个和输入数组大小一样的数组，用target-原数组元素nums[i]并依次赋值给help[i]，建立一个全新的数组help，只需要通过比较当前元素help[i]与原数组nums[i+1]后面的元素是否相等，即可判断nums[i]+nums[j]...]]></description><category></category></item></channel></rss>