虚假唤醒(spurious wankeups)

典型案例:在wait端必须用while来等待条件变量而不能用if。 // wait端 pthread_mutex_lock(mtx); while(deque.empty()) pthread_cond_wait(...); deque.pop_front(); pthread_mutex_unlock(mtx) ...

一个线程两次调用start()方法会出现什么情况? - 《java核心技术》笔记

java的线程不允许启动两次,第二次调用会抛出IllegalThreadStateException,是一种运行时异常。 线程间状态流转: 就绪:该线程已经在JVM,可能正在运行,也可能正在等待系统分配给它CPU时间片,在就绪队列中排队; 阻塞:等待monitor lock; 等待:正在等待其他线程采取某些操作,比如消费者模式。 需要注意的一些点: 守护线程必须在线程启动之前设置 Thread daemonThread = new ...

java多线程(5) - Java虚拟机中的锁优化技术以及几种锁的介绍

线程的五种状态: 自旋锁 在程序中,Java虚拟机的开发工程师们在分析过大量数据后发现,共享数据的锁定状态一般只会持续很短的一段时间,为了这段时间去挂起和恢复线程其实并不值得。 如果物理机上有多个处理器,可以让多个线程同时执行的话,就可以让后来的线程“稍微(忙)等一下”,不会放弃处理器事件,看看持有锁的线程会不会很快释放锁。这个“稍微等一下”的过程就是自旋。 锁消除 在动态编译同步块的时候,JIT编译器可以借助一种叫逃逸分析( ...

java多线程(4) - Moniter的实现原理

Moniter是什么 我们可以把监视器理解为包含一个特殊的房间的建筑物,这个特殊房间同一时刻只能有一个客人。如果一个顾客想要进去这个房间,就需要在走廊(Entry Set)排队,调度器将基于某个标准来选择排队的客户进入房间。如果用户暂时因为其他事情无法脱身,那么就会被送到等待室(Wait Set)。 监视器是一个用来监视这些线程进入特殊的房间的,它的义务是保证(同一时刻)只有一个线程可以访问被保护的数据和代码。 Monitor其实是一种同步机制,通常被描述为一个对象,其主要特点是: ...

java多线程(3) - java的对象头

回顾 当一个Java类在被JVM加载后,JVM会给这个类创建一个instanceKlass,保存在方法区,用于在JVM层表示该Java类。 当我们在代码中new一个对象时,JVM会创建一个instanceOopDesc对象,包含了对象头以及实例数据。 对象头包括: class oopDesc { friend class VMStructs; private: volatile markOop _mark; union _metadata ...