Giter Club home page Giter Club logo

java-concurrency's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

java-concurrency's Issues

Exchanger 代碼有問題

最後結果次序不對

女生慢慢的从教室你走出来......
女孩儿说:我也很喜欢你......
男孩儿说:我其实暗恋你很久了......

07.三大性质总结:原子性、可见性以及有序性

原文:如果2和3进行了重排序的话,线程B进行判断if(instance==null)时就会为true,而实际上这个instance并没有初始化成功,显而易见对线程B来说之后的操作就会是错得。

在解释双重加锁的时候提到指令重排序后,如果先分配内存地址而不是先初始化,内存地址现在已经有值,那么if(instance==null)是不是应该返回为false

CountDownLatchDemo

首先很感谢您的分享,知识点总结的很详细,通俗易懂。经测试,CountDownLatchDemo代码有问题,执行结果与您分享的不一致,但不知是什么问题。

关于AbstractQueuedSynchronizer类中enq方法并没有让tail指向新的尾节点的两个疑问

private Node enq(final Node node) {
        for (;;) {
            Node t = tail;
			if (t == null) { // Must initialize
				//1. 构造头结点
                if (compareAndSetHead(new Node()))
                    tail = head;
            } else {
				// 2. 尾插入,CAS操作失败自旋尝试
                node.prev = t;
                if (compareAndSetTail(t, node)) {
                    t.next = node;
                    return t;
                }
            }
        }
}

以上为enq()方法。
当队列为null时进入的enq方法,那
第一次循环是创建了头结点并且head,tail都指向此头结点。
那第二次循环是将参数node加入该头结点之后,形成第一个节点。但是为啥代码中tail没有更新呢?(意思就是现在tail,head,t都是指向"头结点")

自己的猜测:是否是在compareAndSetTail(t, node)中更新了tail值。

第二个问题是为什么返回t而不是tail?毕竟不管上面的假设成立不成立,t都指向新插入节点的前一个节点,而不是新节点。

4.彻底理解synchronized

如图,上面用黄色高亮的部分就是需要注意的部分了,这也是添Synchronized关键字之后独有的。执行同步代码块后首先要先执行monitorenter指令,退出的时候monitorexit指令。通过分析之后可以看出,使用Synchronized进行同步,其关键就是必须要对对象的监视器monitor进行获取,当线程获取monitor后才能继续往下执行,否则就只能等待。而这个获取的过程是互斥的,即同一时刻只有一个线程能够获取到monitor。上面的demo中在执行完同步代码块之后紧接着再会去执行一个静态同步方法,而这个方法锁的对象依然就这个类对象,那么这个正在执行的线程还需要获取该锁吗?答案是不必的,从上图中就可以看出来,执行静态同步方法的时候就只有一条monitorexit指令,并没有monitorenter获取锁的指令。这就是锁的重入性,即在同一锁程中,线程不需要再次获取同一把锁。Synchronized先天具有重入性。每个对象拥有一个计数器,当线程获取该对象锁后,计数器就会加一,释放锁后就会将计数器减一。


执行一个静态同步方法
哪里执行了同步啊?

最后的例子

想请问一下 最后的例子 如果在while循环中加入任意的代码 那么这个时候变量不加volatile关键字也能够感知到主线程的变量修改 这个地方有点不太清楚

线程状态转换的错误,WAITING不能直接转变为RUNNABLE

线程的状态转换以及基本操作这篇文章中的线程状态转换关系.png,展示了线程可以从WAITING状态直接转变为RUNNABLE状态,但是事实不是,WAITING不能够直接转变为RUNNABLE状态,WAITING需要先转变为BLOCKED状态,获取到对象的锁后,才能够转变为RUNNABLE状态。

相关的资料:

关于偏向锁升级为轻量级锁的疑问

请问,原文中提到偏向锁在发生竞争时,会在全局安全点撤销。撤销之后原来持有偏向锁的线程继续执行任务时,还持有锁吗?持有的是轻量级锁?如果是轻量级锁,那么它的上锁过程是在偏向锁撤销后立即发生的吗?

内存使用计算问题

如果这些对象占用的内存比较大,比 如说200M左右,那么再写入100M数据进去,内存就会占用300M

这里不是500M?

3.java内存模型以及happens-before规则

原文中写到:
在<<深入理解Java虚拟机>>中看到的定义。原文如下: 当多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,那这个对象是线程安全的。

其中加粗的地方应该是或者在调用方不进行任何其他的协调操作吧。

并发编程的优缺点中几个错别字

  1. 开头段,以提升理解和堆并发编程的认知 -> 以提示理解和对并发编程的认知
  2. 为什么要用到并发中,它只是基于认为观测数据后 -> 它只是基于人为观测数据后
  3. 3.1同步vs异步, 在超时购物->在超市购物

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.