- 浏览: 2663474 次
- 来自: 杭州
文章分类
- 全部博客 (1188)
- webwork (4)
- 网摘 (18)
- java (103)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (14)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (7)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介 -
107x:
不错,谢谢!
Python机器学习库
问题:假想在服务器上运行着若干个响应客户端请求的线程,这些线程需要连接到同一数据库,但任一时刻只能获得一定数目的数据库连接。你要怎样才能够将这些固定数量的数据库连接分配给大量的线程?
一种控制访问特定资源的方法,就是使用信号量计数. 我们可以将一个信号量初始化为可获得的数据库连接个数。一旦某个线程获得了信号量,可获得的数据库连接数减一。线程消耗完资源并释放该资源时,计数器就会加一。当信号量控制的所有资源都已被占用时,若有线程试图访问此信号量,则会进入阻塞状态,直到有可用资源被释放.
信号量最常见的用法是解决“消费者-生产者问题”。当一个线程进行工作时,若另外一个线程访问同一共享变量,就可能产生此问题。消费者线程只能在生产者线程完成生产后才能够访问数据。使用信号量来解决这个问题,就需要创建一个初始化为零的信号量,从而让消费者线程访问此信号量时发生阻塞。每当完成单位工作时,生产者线程就会向该信号量发信号(释放资源)。每当消费者线程消费了单位生产结果并需要新的数据单元时,它就会试图再次获取信号量。因此信号量的值就总是等于生产完毕可供消费的数据单元数。这种方法比采用消费者线程不停检查是否有可用数据单元的方法要高效得多。因为消费者线程醒来后,倘若没有找到可用的数据单元,就会再度进入睡眠状态,这样的操作系统开销是非常昂贵的。
举一个简单的例子:
假设有两个线程,彼此需要通信。再假设线程A正在等线程B的消息:
这样写可以,但比较糟糕。线程A需要每100ms检测一次(一秒检测10次)线程B是否发送了消息;它也可能睡过了头(指Thread.sleep(100)——译者),没能及时接收消息。还有,如果多个线程都在等待消息,应该怎么办?难道没有一种方式可以让线程A不用这么呆头呆脑的等线程B的消息吗?
幸运的是,wait() 和 notify()方法能做到。
Wait()方法用在同步的代码块里,当wait()被执行时,锁会被释放,线程进入等待状态。
方法notify() 同样用在同步的代码块里。Notify()将通知等待相同锁的线程,如果有多个线程在等待这个锁,将从中随机选择一个进行通知。
下面是更新的代码:
线程B调用notify(),并离开这个同步方法后(释放加在this上的锁), 线程A 重新获得这个锁,并完成它的同步代码。本例中,它只是返回。
你也可以选择等待的最大时间值,wait()方法可以将其作为参数:
wait(100);
如果线程从未被通知,这种写法等价于让线程sleep一个指定时间;不幸的是,我们没法知道wait()方法的返回是由于等待的时间到了,还是由于线程被通知。
另一种通知的方法, notifyAll(), 将会通知所有等待这个锁的线程,而不是只通知一个。
方法 wait(), notify(), 和 notifyAll() 是Object 类的方法,因此所有的Java对象都会有这些方法,就像所有的Java对象都可用作一个锁一样。
一种控制访问特定资源的方法,就是使用信号量计数. 我们可以将一个信号量初始化为可获得的数据库连接个数。一旦某个线程获得了信号量,可获得的数据库连接数减一。线程消耗完资源并释放该资源时,计数器就会加一。当信号量控制的所有资源都已被占用时,若有线程试图访问此信号量,则会进入阻塞状态,直到有可用资源被释放.
信号量最常见的用法是解决“消费者-生产者问题”。当一个线程进行工作时,若另外一个线程访问同一共享变量,就可能产生此问题。消费者线程只能在生产者线程完成生产后才能够访问数据。使用信号量来解决这个问题,就需要创建一个初始化为零的信号量,从而让消费者线程访问此信号量时发生阻塞。每当完成单位工作时,生产者线程就会向该信号量发信号(释放资源)。每当消费者线程消费了单位生产结果并需要新的数据单元时,它就会试图再次获取信号量。因此信号量的值就总是等于生产完毕可供消费的数据单元数。这种方法比采用消费者线程不停检查是否有可用数据单元的方法要高效得多。因为消费者线程醒来后,倘若没有找到可用的数据单元,就会再度进入睡眠状态,这样的操作系统开销是非常昂贵的。
举一个简单的例子:
假设有两个线程,彼此需要通信。再假设线程A正在等线程B的消息:
// Thread A public void waitForMessage() { while (hasMessage == false) { Thread.sleep(100); } } // Thread B public void setMessage(String message) { ... hasMessage = true; }
这样写可以,但比较糟糕。线程A需要每100ms检测一次(一秒检测10次)线程B是否发送了消息;它也可能睡过了头(指Thread.sleep(100)——译者),没能及时接收消息。还有,如果多个线程都在等待消息,应该怎么办?难道没有一种方式可以让线程A不用这么呆头呆脑的等线程B的消息吗?
幸运的是,wait() 和 notify()方法能做到。
Wait()方法用在同步的代码块里,当wait()被执行时,锁会被释放,线程进入等待状态。
方法notify() 同样用在同步的代码块里。Notify()将通知等待相同锁的线程,如果有多个线程在等待这个锁,将从中随机选择一个进行通知。
下面是更新的代码:
// Thread A public synchronized void waitForMessage() { try { wait(); } catch (InterruptedException ex) { } } // Thread B public synchronized void setMessage(String message) { ... notify(); }
线程B调用notify(),并离开这个同步方法后(释放加在this上的锁), 线程A 重新获得这个锁,并完成它的同步代码。本例中,它只是返回。
你也可以选择等待的最大时间值,wait()方法可以将其作为参数:
wait(100);
如果线程从未被通知,这种写法等价于让线程sleep一个指定时间;不幸的是,我们没法知道wait()方法的返回是由于等待的时间到了,还是由于线程被通知。
另一种通知的方法, notifyAll(), 将会通知所有等待这个锁的线程,而不是只通知一个。
方法 wait(), notify(), 和 notifyAll() 是Object 类的方法,因此所有的Java对象都会有这些方法,就像所有的Java对象都可用作一个锁一样。
发表评论
-
Raft
2018-07-12 14:20 762前言 上篇文章说解决问题要分而治之,先把分片的问题解决了再 ... -
java uuid
2017-09-14 18:18 560在java中产生uuid的方式是使用java.util.UU ... -
JAVA 编码规范
2017-09-06 11:34 418https://google.github.io/style ... -
mac 入门
2015-12-01 16:28 626http://foocoder.com/blog/wo-zai ... -
java 反编译工具gad
2014-05-09 12:04 977java 反编译工具gad,备个份。 -
java 代码大全(code book)
2014-04-29 10:59 1083参考这里: http://www.java2s.com/C ... -
SQL语法解析器JSQLParser
2014-02-09 19:53 2150SQL 语法解释器jsqlparser 是用java ... -
BufferedInputStream 深入研究。
2013-11-19 13:26 14271. BufferedInputStream的基本原理 ... -
java 启动脚本
2013-08-22 19:08 982java 启动脚本 #!/bin/bash cmd=&q ... -
CRLF escape
2013-08-06 17:51 1201最近需要对用户输入的CRLF即(\r\n)做escape, ... -
安全的自增类
2013-07-22 18:16 991java中一个计数器如果超过MAX_VALUE再自增会如何? ... -
solr日志被block的问题
2013-05-23 16:48 1265"catalina-exec-22386" ... -
beanMapper
2013-01-13 22:43 889实在被一堆get,set搞烦了,周末写了一个beanMappe ... -
java instanceof ,isInstance(),isAssignableFrom之前的差异
2013-01-06 11:00 962public class ItemQuery { ... -
通过gzip对字符串压缩
2012-12-22 18:10 3128通过GZIPOutputStream,GZIPInputStr ... -
关于URL编码
2012-12-21 14:18 1112一、问题的由来 URL就是网址,只要上网,就一定会用到。 ... -
spring的FactoryBean机制
2012-11-20 16:18 1240spring可以通过的FactoryBean的形式把一个Fac ... -
HashMap cpu占用 100%
2012-11-10 22:22 1815今天在重现出HashMap cpu占用100%了,只 ... -
文字扫描工具--java.util.Scanner
2012-11-10 14:33 1102A simple text scanner which c ... -
一个隐形的java int溢出
2012-11-06 22:17 1120故事的背景: 笔者最近在做一个类SNS的项目, ...
相关推荐
在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...
本文将深入探讨`wait()`, `notify()`以及它们与`sleep()`方法的区别,这些都是Java中与线程同步密切相关的概念。 首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。...
在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要用于解决生产者消费者问题、读者写者问题等典型同步问题。这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在...
### 一个理解wait()与notify()的例子 #### 知识点概述 本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要...
### wait, notify等线程知识详解 #### 一、引言 在计算机程序设计中,尤其是在多线程环境中,线程间的同步与通信是保证程序正确性和效率的关键因素之一。`wait` 和 `notify` 是Java语言提供的原生方法,用于解决...
Object类中的wait和notify方法是Java多线程编程中最重要的同步机制之一,它们是Java.lang.Object类中的两个方法,用于在多线程之间进行通信和同步。wait方法将当前线程置于等待状态,而notify方法则用于唤醒等待的...
*练习wait()和notify()方法 */ public class TestBank { public static void main(String[] args) { Account acc = new Account(“1234” , “1234” , 2000.0); Thread h = new Thread(new Husband(acc) , ...
在Java编程语言中,`wait()`和`notify()`是Object类中的两个关键方法,它们用于线程间的协作和通信。这两个方法在多线程环境下尤其重要,因为它们允许线程等待特定条件并通知其他线程继续执行。在分析给定的程序之前...
本文将深入探讨`wait`、`notify`以及`notifyAll`这三个关键字的使用及其背后的原理,帮助你理解如何在实际编程中有效地利用它们来解决线程同步问题。 首先,我们需要了解Java中的对象锁。每个Java对象都有一个内置...
在Java中,`wait()`, `notify()`, `notifyAll()`方法是`Object`类的成员,而不是`Thread`类的,这意味着任何对象都可以作为等待和通知的基础。 **1. 状态变量(State Variable)** 状态变量是线程间通信的关键。当...
在并发编程中,除了Thread外,对Object对象的wait()和notify()方法也应该深入了解其用法,虽然知识点不多,但非常重要。wait()、notify()和notifyAll()方法都是Object类的方法,可以认为任意一个Object都是一种资源...
5. **中断处理**:线程在等待时可能需要响应中断,`Thread.interrupt()`方法可以用来中断线程,而`wait()`方法会抛出`InterruptedException`,允许程序优雅地处理中断。 6. **哲学家就餐问题**:这是一个经典的多...
文章目录1 wait、notify、notifyAll简单介绍1.1 使用方法 + 为什么不是Thread类的方法1.2 什么时候加锁、什么时候释放锁?1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程...
- `wait()`是可中断的,当线程被中断(`Thread.interrupt()`)时,`wait()`会抛出`InterruptedException`,这时线程需要处理中断状态,决定是否继续等待或结束。 - 使用`wait()`时,应避免无限期等待,通常建议...
Java多线程编程中,`wait()`, `notify()`, 和 `notifyAll()` 是三个非常重要的方法,它们用于线程间通信和同步。这些方法并不是定义在 `Thread` 类中的,而是作为 `Object` 类的一部分,这意味着任何Java对象都可以...
`sleep()` 适用于需要让线程暂时退出执行的情况,`yield()` 用于尝试平衡多个线程的执行,而 `wait/notify/notifyAll()` 则用于线程间的协作,确保资源的有效共享。理解这些方法的差异和使用场景,能帮助开发者更好...
线程间通信主要通过`wait()`, `notify()` 和 `notifyAll()` 方法,以及`join()`方法来实现。此外,Java还提供了线程池(ExecutorService)来管理线程,以提高性能和减少资源消耗。 同步是多线程环境下保证数据一致...
根据给定的文件信息,我们可以深入探讨Java中的多线程同步机制,特别是关于`wait()`、`notify()`和`synchronized`关键字的使用及其在实际应用中的表现。此测试结果输出揭示了多线程环境中线程的启动、等待、唤醒以及...