线程随笔

  • 每次线程调用变量时是直接取自己的工作存储器中的值还是先从主存储器复制再取是没有保证的;

  • 线程改变变量的值之后,是否马上写回到主存储器上也是不可保证的;

  • 当线程进入或者离开同步代码块时会将私有拷贝与共享内存中的原始值进行比较;

  • 线程在试图读取一个volatile变量时,会从主内存区中读取最新的值;

  • ReentrantLock是具有和synchronized类似功能的性能功能加强版同步锁;

  • synchronized缺点:1.未得到锁的线程只能不停的尝试获得锁,而不能中断。这种情况对于大量的竞争线程会造成性能的下降等后果;2.只有一个condition(即synchronized针对的对象锁)与锁相关联;

  • 针对synchronized的缺点,JDK5提供了ReentrantLock;

  • ReentrantLock提供了lockInterruptibly()方法可以优先考虑响应中断,而不是像synchronized那样不响应interrupt()操作。解释一下响应中断是什么意思:比如A、B两线程去竞争锁,A得到了锁,B等待,但是A有很多事情要处理,所以一直不返回。B可能就会等不及了,想中断自己,不再等待这个锁了,转而处理其他事情。在这种情况下,synchronized的做法是,B线程中断自己(或者别的线程中断它),我不去响应,继续让B线程等待,你再怎么中断,我全当耳边风。而lockInterruptibly()的做法是,B线程中断自己(或者别的线程中断它),ReentrantLock响应这个中断,不再让B等待这个锁的到来。有了这个机制,使用ReentrantLock时就不会像synchronized那样产生死锁了;

  • ReentrantLock在提供了多样的同步功能(除了可响应中断,还能设置时间限制),因此在同步比较激烈的情况下,性能比synchronized大大提高(按:原因主要是可以中断等待的线程);

  • 同步竞争不激烈的情况下,synchronized还是非常合适的;

你可能感兴趣的:(同步)