- 浏览: 463333 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (369)
- javascript html (20)
- java (31)
- jquery (15)
- jcrop (0)
- JEECG (1)
- ajax (3)
- 反射 (3)
- VI (1)
- mysql (48)
- easyui (1)
- svn (2)
- MD5 加密 (1)
- spring (14)
- ORACLE (8)
- 经验总结 (1)
- TCP/IP协议 (1)
- ICMP协议 (1)
- eclipse (1)
- Reflect (1)
- linux (21)
- android (5)
- excel 操作 (1)
- java tree (1)
- html (1)
- plupload (1)
- mongodb (9)
- aes (1)
- python (1)
- java relax (1)
- highcharts (2)
- json (2)
- java 多线程 (30)
- maven (2)
- 设计模式 (1)
- jsp+js (2)
- 面向对象 (1)
- jvm (16)
- 缓存 (1)
- proxy (1)
- 聊侃 (1)
- 面经 (1)
- java 字节 (1)
- java 类加载器 (2)
- java 基础 (2)
- java 语法糖 (1)
- java 位运算 (1)
- 排序 (3)
- java 服务器性能优化 (19)
- 网络编程 (2)
- jvm 参数设置 (0)
- jersey (1)
- webservice (2)
- nginx+多tomcat 集成 (5)
- nginx (16)
- squid (3)
- memcached (5)
- 正则表达式 (1)
- 常用免费接口 (1)
- jpa (1)
- win7 (1)
- java处理大文件 (1)
- js正则表达式 (1)
- tomcat (1)
- java 敏感字 (1)
- 系统架构优化 (4)
- 学习 (1)
- 本地测试QQ微博第三方登陆 (1)
- java 错误 (1)
- 微信支付 (1)
- https (1)
- httpclient (1)
- awk (2)
- loadrunner (1)
- sql server 2008 (3)
- git (4)
- sql server2008 (1)
- solr (2)
- centos (1)
- 数据存储架构 (3)
- log4j (1)
- weboffice (1)
- 并发编程 (1)
- postgreSQL (0)
- ssl (1)
- openssl (1)
- activeMQ (2)
- IDEA (1)
- shell (1)
- ansible (4)
- docker (2)
- grafana (1)
- jmeter (1)
- TLS (1)
- 将博客搬至CSDN (1)
最新评论
-
dida1990:
啊喔,过去了这么久,不过还是评一个。谁说uuid的hashCo ...
高并发生成订单号(二) -
annan211:
yclovesun 写道使用了uuid,为什么还要machin ...
高并发生成订单号(二) -
yclovesun:
使用了uuid,为什么还要machineId?uuid已经可以 ...
高并发生成订单号(二) -
u013280917:
太深奥,看不懂
mysql优化特定类型的查询
生产者线程用于往链表里添加节点,数个工作线程从链表取出节点并处理。对于一般的mutex_lock,mutex_unlock方式,如果这一段时间没有工作,那么工作线程将会不停的调用lock,unlock操作。而这样的操作毫无疑义。
在这里系统给我们提供了另外一种同步机制,信号灯,Semaphore。
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。很多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流量的红绿灯,比如XX马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入XX马路,但是如果前一百辆中有五辆车已经离开了XX马路,那么后面就允许有5辆车驶入马路,这个例子里说的车就是线程,驶入马路就表示线程在执行,离开马路就表示线程执行完成,看见红灯就表示线程被阻塞,不能执行。
Semaphore可以用于做流量控制,特别公用资源有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发的读取,但是如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这时我们必须控制只有十个线程同时获取数据库连接保存数据,否则会报错无法获取数据库连接。这个时候,我们就可以使用Semaphore来做流控,代码如下:
在这里系统给我们提供了另外一种同步机制,信号灯,Semaphore。
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。很多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流量的红绿灯,比如XX马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入XX马路,但是如果前一百辆中有五辆车已经离开了XX马路,那么后面就允许有5辆车驶入马路,这个例子里说的车就是线程,驶入马路就表示线程在执行,离开马路就表示线程执行完成,看见红灯就表示线程被阻塞,不能执行。
Semaphore可以用于做流量控制,特别公用资源有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发的读取,但是如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这时我们必须控制只有十个线程同时获取数据库连接保存数据,否则会报错无法获取数据库连接。这个时候,我们就可以使用Semaphore来做流控,代码如下:
package thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaphoreTest { private static final int THREAD_COUNT = 30; private static ExecutorService threadPool = Executors .newFixedThreadPool(THREAD_COUNT); private static Semaphore s = new Semaphore(10); public static void main(String[] args) { for (int i = 0; i < THREAD_COUNT; i++) { final int num = i; threadPool.execute(new Runnable() { @Override public void run() { try { s.acquire(); System.out.println(Thread.currentThread().getName()+"--save data--"+num); s.release(); } catch (InterruptedException e) { } } }); } threadPool.shutdown(); } }
发表评论
-
java 多线程操作数据库 及 静态bean注入
2018-01-09 10:47 923package com.robustel.rlink.de ... -
Amino 框架简介
2014-10-17 11:30 1431对数据加锁是实现多线程的一种策略,但是加锁无疑会增加系 ... -
Java 重入锁(ReentrantLock)和内部锁(synchronized)
2014-10-16 15:44 1599ReentrantLock 和 synchronize的 ... -
Java 锁分离
2014-10-16 15:35 1339读写锁思想的延伸就是锁分离。读写锁根据读写操作功能上 ... -
java 高性能运算-- 双端队列
2014-10-15 16:04 1051JDK 1.6中 提供了一种双端队列,简称 Dequ ... -
java 高性能运算--并发队列
2014-10-15 15:33 2494JDK 提供了两套并发队列的实现,一个是以 Conc ... -
并发模式下的单例创建
2014-09-29 16:20 792单例模式的创建 分为 ... -
Java 同步集合的应用
2014-09-14 23:45 0Java 同步集合的应用 -
java 阻塞队列的应用
2014-09-14 23:44 0java 阻塞队列的应用 -
java 多线程集合
2014-09-14 23:28 0java 多线程集合 -
java Exchanger 线程数据交换
2014-09-14 22:56 0java Exchanger 线程数据交换 -
java CountDownLatch 实例
2014-09-15 18:07 855Java的concurrent包里面的CountDownLat ... -
java 多线程之 CyclicBarrier
2014-09-13 19:25 821CyclicBarrier (周期障碍)类可以帮助同步,它允许 ... -
java CyclicBarrier 循环阻塞
2014-09-12 22:43 447java CyclicBarrier 循环阻塞 -
java 多线程的锁消除
2014-09-12 18:31 1251Java 中使用同步 来保证数据的安全性,但是对于一些明显不会 ... -
java锁的种类以及辨析(一):自旋锁
2014-09-12 16:22 1636Java的多线程安全是基于Lock机制(或者隐式锁synchr ... -
Java锁的种类以及辨析
2014-09-12 15:15 1579锁作为并发共享数据,保证一致性的工具,在java平台有多种实现 ... -
4个线程,2个每次加1,两个每次减1
2014-09-01 23:44 859package threadTest; public ... -
线程范围内的共享数据 ThreadLocal 分析与详解
2014-08-30 19:21 815Java 线程范围内的数据共享机制,需要解决的问题是 : 多 ... -
java多线程之Semaphore信号量详解
2014-08-27 13:35 1317原创作品,允许转载,转载时请务必以超链接形式标明文章 原始 ...
相关推荐
**JAVA 多线程之信号量Semaphore实例详解** 在Java多线程编程中,信号量Semaphore是一种非常重要的同步工具,用于控制对公共资源的访问。Semaphore类位于`java.util.concurrent`包下,它允许我们限制同时访问特定...
Java并发编程之Semaphore(信号量)详解及实例 在 Java 中,Semaphore(信号量)是一种非常有用的并发编程工具,主要用于控制访问某些资源的线程数目。下面,我们将详细介绍 Semaphore 的原理、实现和实例。 ...
读写信号量是信号量的一个变体,它区分读操作和写操作。在上面的`rw_semaphore`类中,`READ_ACCESS`代表读权限,`WRITE_ACCESS`代表写权限。类内部维护了读者和写作者的数量,通过互斥锁(`$mutex`)保证对计数器...
(`java.util.concurrent` 包) 提供了高级线程管理工具,如`ExecutorService`用于管理和控制线程池,`CountDownLatch`用于同步多个线程,`CyclicBarrier`让一组线程等待其他线程到达屏障点,以及`Semaphore`进行信号...
此外,还可以使用Semaphore信号量、CountDownLatch倒计时锁、CyclicBarrier同步屏障等工具类。 以上是部分Java多线程设计模式的概述,每个模式都有其适用场景和优缺点。实际开发中,开发者应根据需求选择合适的模式...
3. **线程同步**:为避免多线程环境中的数据不一致性,Java提供了多种同步机制,如synchronized关键字、Lock接口(ReentrantLock)、Semaphore信号量、CountDownLatch倒计时锁和CyclicBarrier同步屏障等。...
Visual C++提供了多种同步原语,如临界区(Critical Section)、互斥量(Mutex)、事件(Event)、信号量(Semaphore)等。这些工具可以帮助开发者控制线程对共享资源的访问,确保数据的一致性和完整性。 此外,线程间的...
Java并发包`java.util.concurrent`提供了如`Semaphore`(信号量)、`CountDownLatch`(计数器)、`CyclicBarrier`(回环栅栏)等工具,它们是设计来协助多线程间的协作和同步的。 理解并熟练运用这些知识点,可以...
#### 三、信号量详解 ##### 3.1 概念介绍 信号量是一种更高级的同步机制,它允许一定数量的线程或进程同时访问某个资源。信号量通常用于实现资源池或限制并发访问数量,以避免系统过载。 ##### 3.2 应用场景 - **...
在多线程编程中,互斥锁(Mutex)和信号量(Semaphore)是用来保证线程安全、控制对共享资源的并发访问的重要机制。Python通过threading模块提供了一套丰富的同步原语,包括互斥锁和信号量,使得开发者可以更加方便...
- **Semaphore:** 信号量,用于控制多个线程对共享资源的访问。 #### 二、高级特性和设计模式 - **线程池:** - **ExecutorService:** 提供了一种管理线程的方法,可以控制线程的并发数量,简化线程的管理和...
为了解决这一问题,Python提供了多种同步机制,包括互斥锁、递归锁、信号量和事件。下面将详细介绍这些同步工具的概念、原理以及使用方法。 1. 互斥锁(Mutex Lock): 互斥锁是确保同一时间只有一个线程访问特定...
5. **同步机制**:Java提供了多种同步机制,包括`synchronized`关键字、`Lock`接口(如`ReentrantLock`)、`Semaphore`信号量和`Condition`条件对象。它们用于控制对共享资源的访问,防止数据不一致性和死锁。 6. *...
#### 三、内核信号量详解 ##### 构造与属性 内核信号量是`struct semaphore`类型,其关键成员包括: - `count`:代表信号量的当前值,反映了资源的可用状态。 - `wait`:指向等待队列的链表头部,记录所有等待...
然而,实际的解决方案可能更复杂,需要考虑到更多的并发控制策略,例如使用信号量(Semaphore)或者读写锁(ReentrantReadWriteLock)。此外,还可以使用非阻塞的并发控制技术,如Java并发库中的`java.util....
- **信号量(Semaphore)**:`sem_t`类型表示信号量,可以用来控制对资源的访问数量。 - **读写锁(Read-Write Locks)**:允许多个读者同时访问,但只允许一个写者。`pthread_rwlock_t`类型表示读写锁,有`...
此外,同步机制如互斥量(mutex)、事件对象(event)或信号量(semaphore)也会被讨论,以解决线程间的同步问题,防止数据竞争。 网络编程中,错误处理是不可忽视的一部分。书中会讲解如何正确处理网络操作中的...