SynchronousQueue

往链表尾部放节点,put和offer的节点里元素是有内容的(有没有内容是看isData属性),take和poll的节点里元素是null。放进去就开始挂起(根据传入参数判断你是不挂起直接返回,仍是挂起直到唤醒,仍是挂起固定的时间以后本身唤醒)。并发

放节点的时候会判断:跟前一个节点的isData是否相同,若是相同(这里有前一个节点是头结点的状况),new一个放后面。若是不一样,好比本身是取,说明前一个是放,并在挂起等待别人取。那么取走,元素置空,唤醒挂起的,挂起线程被唤醒以后发现本身的元素已经被置空说明已经被取走,完成放置任务,退出。反之,本身是放,一个道理。线程

整个过程当中,由于是个单链表,并发冲突有两点:头结点和尾节点的后移和节点元素的置换,这两点在for循环中用cas是能够作到的。for循环

相关文章
相关标签/搜索