一道面试题,多线程, 一个线程增加变量,另一个打印出变量值。我的做法:
public class MultiThreadsTest {
int size = 1000;
private int i= 0;
boolean printlable = false;
Object lock = new Object();
Thread addI = new Thread(new Runnable(){
public void run(){
for(int j=0; j<size; j++){
synchronized(lock){
if(printlable){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
synchronized(lock){
i++;
printlable = true;
lock.notify();
}
}
}
});
Thread printI = new Thread(new Runnable(){
public void run(){
for(int j=0; j<size; j++){
synchronized(lock){
if(!printlable){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
synchronized(lock){
System.out.println(i);
printlable = false;
lock.notify();
}
}
}
});
public static void main(String[] args){
MultiThreadsTest mt = new MultiThreadsTest();
mt.addI.start();
mt.printI.start();
}
}
分享到:
相关推荐
当一个线程修改全局变量时,其他线程能够看到这一变化,这是多线程共享全局变量的基本机制。 **二、全局变量与`global`关键字** 在函数内部操作全局变量时,如果不使用`global`关键字,Python会默认创建一个局部...
- **条件变量**:用于线程间的协作,一个线程等待特定条件满足时,可以释放锁并进入等待状态,当条件满足时,其他线程可以唤醒它。 - **信号量**:计数型信号量可以用来控制对有限资源的访问,二值信号量类似于...
- synchronized关键字:用于方法或代码块,确保同一时间只有一个线程能执行特定代码。 - volatile关键字:确保共享变量的值对所有线程可见,但不保证原子性。 - Lock接口和ReentrantLock类:提供比synchronized更细...
`synchronized`可以修饰方法或代码块,当一个线程进入某个被`synchronized`保护的区域后,其他试图进入的线程将会被阻塞,直到当前线程执行完毕退出。 以下是可能的实现方案: ```java public class ThreadTest { ...
该方法打印线程名称以及一个随机整数(范围[0,99]),直到变量`i`达到50为止,每次循环增加2。 4. **main() 方法**: - 创建两个`NumberThread`实例,分别命名为"|jishu|"和"|oushu|",并设置它们的初始值分别为1和...
这样可以确保在任何时候只有一个线程能够修改共享变量,从而避免竞态条件。 例如,我们可以在上述的`add_func1`和`add_func2`中引入锁来确保线程安全: ```python import threading # 初始化全局变量和锁 g_num =...
在上述代码中,可以将`run()`方法或者包含对`x`的操作的代码块标记为`synchronized`,以确保每次只有一个线程能够访问和修改`x`。 ```java public synchronized void run() { for (int i = 0; i ; i++) { System....
线程1和线程2分别在1秒和2秒的间隔内向两个可以容纳3个整数的缓冲区buf1和buf2写入10个数(1到10和-1到-10),并使用信号量sem1和sem2来确保每次只有一个线程能写入数据。线程3每3秒读取buf1和buf2中的数据,按顺序...
为了解决这一问题,可以使用锁(Lock)或递归锁(RLock)来确保在同一时刻只有一个线程可以访问资源。 ```python import threading my_lock = threading.RLock() class MyThread(threading.Thread): def run...
- `Counter`类有一个整型变量`counterValue`用于存储计数器的当前值。 - 定义了三个方法:`increment()`用于增加计数器的值,`decrement()`用于减少计数器的值,`reset()`用于将计数器重置为0。 - 在`Counter`类...
这个问题来源于计算机科学领域的一个典型同步问题案例,旨在通过设计并实现一个多线程程序,模拟理发店内理发师与顾客之间的交互过程,进而解决线程间的同步问题。 #### 初始条件和技术要求 **初始条件:** - 操作...
线程的数量由`hardware_threads`(即`std::thread::hardware_concurrency()`的返回值)和2的较小值决定,这是因为即使只有一个核心,至少也需要一个线程来执行主线程的工作。 每个`accumulate_block`实例在内部调用...
`Test`类中,`add`方法首先增加`a`变量的值,然后调用`friend`对象的`delete`方法,之后打印出当前线程名称和"add"字符串。`delete`方法则减少`a`变量的值,并打印出当前线程名称和"delete"字符串。 关键在于`add`...
每个线程在打印后会释放自己的条件变量,并通知另一个线程可以开始执行。 第二个例子展示了如何实现一个支持并发的环形队列。环形队列是一个循环数组,用于存储元素且可以在两端进行插入和删除操作。在这个实现中,...
此外,为了优化性能,你可能需要考虑并发处理条码打印,例如使用多线程或异步操作。这样可以显著提高批量打印的效率,但同时也会增加代码的复杂性,需要合理管理和控制并发数量,防止打印机过载。 总结,C#调用...
例如,当一个线程修改了类变量(如 `Test.cache`),其他线程可能仍然持有对旧值的引用,导致内存无法完全释放。在示例中,`release_value` 方法尝试删除 `Test.cache` 中的键值对,但并不能保证其他线程不会在删除...
GIL使得在同一时刻只有一个线程能执行Python字节码,即使在多核处理器上也是如此,这限制了Python在多线程环境下的并发性能。因此,对于计算密集型任务,使用多进程(`multiprocessing`模块)可能比多线程更有效。 ...
常量的一个关键特性是它们是不可寻址的,这意味着我们无法获取它们在内存中的确切地址。尽管它们确实存储在内存中,但直接访问其地址是不允许的。因此,常量不能作为左值使用,即不能在赋值运算符的左边出现,如0 = ...
如果此时有线程在等待,那么会有一个线程被唤醒,继续其P操作。 4. 释放资源:在完成对资源的操作后,确保进行V操作,以释放资源并可能唤醒等待的线程。这很重要,因为未正确释放信号量可能导致死锁。 5. 避免死锁...