Coder Social home page Coder Social logo

java-concurrency's Issues

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

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

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

CountDownLatchDemo

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

Exchanger 代碼有問題

最後結果次序不對

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

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

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

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

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

相关的资料:

内存使用计算问题

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

这里不是500M?

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

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

最后的例子

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

关于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都指向新插入节点的前一个节点,而不是新节点。

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

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

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

4.彻底理解synchronized

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


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

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.