Semaphore和synchronized的差别

Semaphore和synchronized最主要的差别是Semaphore可以指定多个并发,而synchronized只能是一个!

 

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class SemaphoreTest {
	public static void main(String[] args) {
		ExecutorService service = Executors.newCachedThreadPool();
		final  Semaphore sp = new Semaphore(3);
		for(int i=0;i<10;i++){
			Runnable runnable = new Runnable(){
					public void run(){
					try {
						sp.acquire();
					} catch (InterruptedException e1) {
						e1.printStackTrace();
					}
					System.out.println("线程" + Thread.currentThread().getName() + 
							"进入,当前已有" + (3-sp.availablePermits()) + "个并发");
					try {
						Thread.sleep((long)(Math.random()*10000));
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("线程" + Thread.currentThread().getName() + 
							"即将离开");					
					sp.release();
					//下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
					System.out.println("线程" + Thread.currentThread().getName() + 
							"已离开,当前已有" + (3-sp.availablePermits()) + "个并发");					
				}
			};
			service.execute(runnable);			
		}
	}

}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`synchronized` 和 `Semaphore` 都是在 Java 中用于控制多线程访问共享资源的关键机制,但是它们在功能上有着显著的区别。 ### Synchronized `synchronized` 关键字主要用于同步块(sync block)或者同步方法(sync method)。它提供了一种简单的锁机制,允许线程在进入一个代码块之前先获取锁,当线程完成对该代码块的执行并释放锁后,其他等待此锁的线程才能继续执行。 #### 特点: 1. **锁定粒度**:`synchronized` 对象可以是任意引用类型的变量,并不是只能锁定整个类,这使得锁定的粒度更细,能更好地控制并发操作的范围。 2. **死锁风险**:不当使用 `synchronized` 关键字可能会导致死锁,即两个或多个线程互相等待对方持有的锁,结果没有任何一方能够解锁。 3. **自动加锁与解锁**:当使用 `synchronized` 关键字修饰实例方法或静态方法时,会默认使用当前对象作为锁;而使用 `synchronized(this)` 则表示锁定当前实例本身。 ### Semaphore `Semaphore` 类则是用于限制同时对共享资源的访问数量。它是基于许可的概念,初始状态为一定的许可数量,每次调用 `acquire()` 函数减少许可数,调用 `release()` 函数增加许可数。这意味着可以控制有多少线程同时访问某个资源。 #### 使用场景: 1. **限流**:例如,在处理高并发请求时,通过设置 `Semaphore` 的容量来限制并发执行的最大线程数。 2. **信号量**:在进程间通信时,可用于传递某种“信号”,如在生产者消费者模型中控制生产者向消费者传输出产项的速度。 ### 区别: - **目的与应用场景**:`synchronized` 更适用于控制单个对象的互斥访问,防止数据竞争,适合于锁住某段特定的操作;而 `Semaphore` 更适用于需要控制并发访问的数量,比如限制最大连接数、控制资源分配等。 - **灵活性**:`synchronized` 更侧重于同步控制,而 `Semaphore` 提供了更灵活的方式来管理并发访问的数量。 - **性能考量**:对于高并发的场景下,`Semaphore` 可能比 `synchronized` 更有效率地管理并发请求,因为它可以根据实际需求动态调整锁的持有数。 综上所述,选择 `synchronized` 还是 `Semaphore` 应取决于具体的并发控制需求以及程序的具体设计。理解两者之间的差异有助于合理利用它们各自的优势,优化多线程应用的性能和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值