摘要: 转载请注明出处:http://blog.csdn.net/ns_code/article/details/17348313 happen—before规则介绍 Java语言中有一个“先行发生”(happen—before)的规则,它是Java内存模型中定义的两项操作之间的偏序关系,如果操作A先行发生 阅读全文
posted @ 2018-04-18 09:03 zailushang1996 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 转载请注明出处:http://blog.csdn.net/ns_code/article/details/17290021 在http://blog.csdn.net/ns_code/article/details/17288243这篇博文中,讲述了通过同步实现内存可见性的方法,在http://bl 阅读全文
posted @ 2018-04-18 08:35 zailushang1996 阅读(157) 评论(0) 推荐(0) 编辑
摘要: 加锁(synchronized同步)的功能不仅仅局限于互斥行为,同时还存在另外一个重要的方面:内存可见性。我们不仅希望防止某个线程正在使用对象状态而另一个线程在同时修改该状态,而且还希望确保当一个线程修改了对象状态后,其他线程能够看到该变化。而线程的同步恰恰也能够实现这一点。 ​ 内置锁可以用于确保 阅读全文
posted @ 2018-04-18 08:30 zailushang1996 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁。线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁。获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。 ​ 当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会阻塞。然而,由于内置锁是可重 阅读全文
posted @ 2018-04-18 08:25 zailushang1996 阅读(315) 评论(0) 推荐(1) 编辑
摘要: 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。 ​ 这里实现如下情况的生产 消费模型: ​ 生产者不断交替地生产两组数据“姓名 1 内容 1”,“姓名 2 内容 2”,消费者不断交替地取得这两组数据,这里的“姓名 1” 阅读全文
posted @ 2018-04-11 16:58 zailushang1996 阅读(147) 评论(0) 推荐(0) 编辑
摘要: 如果线程在等待时接到通知,但线程等待的条件还不满足,此时,线程接到的就是早期通知,如果条件满足的时间很短,但很快又改变了,而变得不再满足,这时也将发生早期通知。这种现象听起来很奇怪,下面通过一个示例程序来说明问题。 ​ 很简单,两个线程等待删除List中的元素,同时另外一个线程正要向其中添加项目。代 阅读全文
posted @ 2018-04-11 16:03 zailushang1996 阅读(127) 评论(0) 推荐(0) 编辑
摘要: notify通知的遗漏很容易理解,即threadA还没开始wait的时候,threadB已经notify了,这样,threadB通知是没有任何响应的,当threadB退出synchronized代码块后,threadA再开始wait,便会一直阻塞等待,直到被别的线程打断。 遗漏通知的代码 ​ 下面给 阅读全文
posted @ 2018-04-11 15:37 zailushang1996 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 在Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信。在线程中调用wait()方法,将阻塞等待其他线程的通知(其他线程调用notify()方法或notifyAll()方法),在线程中调用notify()方法或notify 阅读全文
posted @ 2018-04-11 15:33 zailushang1996 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 当线程需要同时持有多个锁时,有可能产生死锁。考虑如下情形: ​ 线程A当前持有互斥所锁lock1,线程B当前持有互斥锁lock2。接下来,当线程A仍然持有lock1时,它试图获取lock2,因为线程B正持有lock2,因此线程A会阻塞等待线程B对lock2的释放。如果此时线程B在持有lock2的时候 阅读全文
posted @ 2018-04-11 15:16 zailushang1996 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 在集合API中,最初设计的Vector和Hashtable是多线程安全的。例如:对于Vector来说,用来添加和删除元素的方法是同步的。如果只有一个线程与Vector的实例交互,那么,要求获取和释放对象锁便是一种浪费,另外在不必要的时候如果滥用同步化,也有可能会带来死锁。因此,对于更改集合内容的方法 阅读全文
posted @ 2018-04-11 15:10 zailushang1996 阅读(116) 评论(0) 推荐(0) 编辑