下面的代码,不加mys.acquire();和mys.release();的时候,各线程会交替输出。
加上的话,各线程会串行输出,说明信号量机制生效了。
MySemaphore.java
interface Semaphore {
void acquire();
void release();
}
public class MySemaphore implements Semaphore{
private StringBuffer runFlag = new StringBuffer("true");
public void acquire(){
synchronized(runFlag){
if(runFlag.toString().equals("true")){
runFlag.setLength(0);
runFlag.append("false");
}else{
try{
runFlag.wait();
runFlag.setLength(0);
runFlag.append("false");
}catch(Exception e){
e.printStackTrace();
}
}
}
}
public void release(){
synchronized(runFlag){
runFlag.setLength(0);
runFlag.append("true");
try{
runFlag.notify();
}catch(Exception e){
e.printStackTrace();
}
}
}
public static void main(String[] args){
Runnable run = new Runnable(){
MySemaphore mys = new MySemaphore();
public void run(){
mys.acquire();
System.out.println(Thread.currentThread().getName() + " start");
for(int j=0;j<10;j++){
System.out.println(Thread.currentThread().getName() + " start " + j);
}
System.out.println(Thread.currentThread().getName() + " end");
mys.release();
}
};
Thread t;
for(int i=0;i<10;i++){
t = new Thread(run);
t.start();
}
}
}
分享到:
相关推荐
Java 中的 synchronized 关键字可以用于实现线程同步。synchronized 关键字可以用来锁定对象或方法,防止多个线程同时访问同一个共享资源。 在 Java 中,还有其他线程同步机制,如volatile 变量、Atomic 变量、Lock...
Java编程中解决这个问题,通常会用到多线程和同步机制,如synchronized关键字或信号量。 在这个解决方案中,"图形界面"使得问题的展示更为直观,用户可以观察到哲学家们的行为和筷子的状态。重庆大学的学生可能会...
在Java中,我们可以使用`java.util.concurrent.Semaphore`类来实现信号量。创建一个信号量时,可以指定初始许可证的数量。以下是一个简单的示例: ```java import java.util.concurrent.Semaphore; public class ...
同时,我们也了解到在实际编程中,清晰地理解各进程的请求、等待、释放等操作,以及正确使用信号量同步机制的重要性。 实验截图和心得体会部分未提供,但可以想象在运行过程中,生产者、消费者和检查员线程交替运行...
除了 synchronized,Java 还提供了其他同步工具,如 ReentrantLock(可重入锁)、Semaphore(信号量)、Condition(条件变量)等,它们提供了更灵活的控制方式。例如,ReentrantLock 具有与 synchronized 类似的功能...
3. **Semaphore信号量**:Java的`java.util.concurrent.Semaphore`类可以用于限制同时访问某个资源的线程数量,实现线程的同步。在这个场景下,可以设置信号量的许可数量为队列的容量,生产者在添加产品前需要获取一...
在实际开发中,synchronized关键字可以应用于各种场景,例如,在多线程环境中访问共享资源、实现线程安全的数据结构、解决线程安全问题等等。 Java并发synchronized锁住的内容解析是Java并发编程中的一种重要机制,...
Java 中提供了多种方式来实现线程同步,如 synchronized关键字、Lock 接口、Condition 接口等。synchronized 关键字可以用于方法或块级别的同步,而 Lock 接口可以用于锁的实现。Condition 接口可以用于线程之间的...
在滴水三期的作业中,你可能需要编写代码来演示如何使用信号量实现线程的同步。这可能包括创建多个线程,每个线程都需要访问某个共享资源,并通过信号量来协调它们的执行。例如,你可以设计一个场景,其中一些线程...
对于Java来说,最常用的同步机制就是synchronized关键字,他是一种基于语言的粗略锁,能够作用于对象、函数、class。每个对象都只有一个锁,谁能够拿到这个锁谁就有访问权限。当synchronized作用于函数时,实际上锁...
Java多线程通信机制的实现方法包括使用synchronized关键字来实现同步,使用wait()和notify()方法来实现线程间的通信。线程之间的通信是通过共享变量和信号量来实现的。共享变量是指多个线程之间共享的变量,而信号量...
Java提供了丰富的并发工具类,如`Semaphore`信号量、`CyclicBarrier`屏障、`CountDownLatch`倒计时器和`Future`未来结果等,它们可以帮助我们设计出更灵活、高效的并发策略。此外,`java.util.concurrent`包下的`...
2. **Semaphore**:信号量,可以控制同时访问特定资源的线程数量。 3. **CountDownLatch/CyclicBarrier/Phaser**:这些工具类用于协调多线程间的同步,实现更复杂的并发控制。 五、实际案例 在`Synchronized`压缩包...
Java中的线程同步还有其他工具,例如`java.util.concurrent`包中的`Semaphore`、`ReentrantLock`等,它们提供了更高级的同步控制,如信号量控制、公平锁、非公平锁等。 线程同步的主要目的是防止数据竞争(Data ...
synchronized关键字是Java中实现同步的基础,它可以用来修饰方法或者代码块,确保同一时刻只有一个线程能够执行被synchronized修饰的代码。synchronized的实现依赖于Java对象头中的MarkWord,该部分记录了锁的状态。...
其中,`Semaphore`类可以用来模拟信号量,从而实现PV操作。`Semaphore`维护了一个许可计数,当计数为0时,表示没有可用的资源,任何试图获取许可的线程将被阻塞,直到有其他线程释放许可。 P操作( acquire() )是...
线程同步通过`synchronized`关键字、`wait()`, `notify()`, 和 `notifyAll()`方法实现。 接下来是信号量的使用。信号量是一种同步原语,用于控制对共享资源的访问。实验要求实现`Semaphore.java`,包含`P()`(下降...
这种机制通常包括但不限于锁机制、信号量、条件变量等。良好的资源同步策略能够避免竞态条件的发生,确保程序的正确执行。 #### 2. 同步的重要性 - **提高程序的可靠性**:通过同步机制可以避免由于并发访问导致的...
2. **java.util.concurrent包**:Java提供了丰富的并发工具类,如Semaphore(信号量)可以限制同时访问某个资源的线程数量,CountDownLatch可以用于线程间的等待与通知,CyclicBarrier可以实现多线程之间的同步点。...
例如,在Java中,可以使用Semaphore类来表示信号量,ReentrantLock或synchronized关键字来实现互斥访问。 压缩包中的"PC.doc"可能是生产者与消费者问题的详细文档,包含了算法描述、伪代码或者示例代码。而...