0 0

设计4个线程对象,两个线程执行减操作,两个线程执行加操作0

这个经常被问到的面试题要求的正确结果是什么?

像下面的代码是正确的吗?

public class Test implements Runnable{
	
	int count;
	
	static Object obj = new Object();

	@Override
	public void run() {
		synchronized(obj){
			if(Thread.currentThread().getName().equals("a")	|| Thread.currentThread().getName().equals("b")){
    count++;
    System.out.println(Thread.currentThread().getName() + "_" + count);
}else{
				count--;
 System.out.println(Thread.currentThread().getName() + "_" + count);
			}
		}		
	}
	
	public static void main(String[] args) throws InterruptedException {
		Test t = new Test();
		new Thread(t, "a").start();
		new Thread(t, "b").start();
		new Thread(t, "c").start();
		new Thread(t, "d").start();
		Thread.sleep(1000);
		System.out.println(t.count);
	}

}
2014年12月23日 21:09

4个答案 按时间排序 按投票排序

0 0

代码是很标准的线程同步代码,没啥问题。
输出结果中,a,b,c,d出现的顺序不一定一样,但是最终输出的count数值一定是0。
这个题目应该是考你对多线程编程的基础吧,看你是否了解多线程是如何运作的。

2014年12月27日 18:03
0 0

代码这样写是不对的。++和--都不是原子操作,多线程下结果有很多可能性,可能会出现超出想象的结果。count要么用AtomicInteger之类的原子变量要么就用synchronized之类的锁才可以。

2014年12月25日 16:54
0 0

这个不是很正规的线程同步吗?有多种可能下啊,不过count肯定是0

2014年12月24日 10:45
0 0

答案0,这有什么问题

2014年12月24日 09:48

相关推荐

    设计4个线程,其中两个对j增加,两个对j减少

    本示例中,我们创建了4个线程,其中两个线程负责递增变量`j`,另外两个线程负责递减`j`。这个设计主要展示了线程同步和竞争条件的概念。 首先,我们需要理解`Thread`类在Java中的作用。`Thread`是Java的内置类,...

    java用线程的两种实现方式设计四个线程两次对J加1两次对J减1

    Java 语言提供了多种方式来实现多线程编程,今天我们将讨论其中的两种实现方式,并使用四个线程来演示对变量 J 的加一和减一操作。 实现方式一:通过继承 Thread 类 在 Java 中,我们可以通过继承 Thread 类来创建...

    两个线程交替执行

    在上述代码中,我们可以看到两个线程 a 和 b,它们之间通过一个锁对象 LOCK 进行同步。线程 a 负责打印数字 1、2、3,而线程 b 负责打印数字 4、5、6。通过使用 synchronized 关键字,我们可以确保在某个时刻只有一...

    C# 多线程互斥 两个线程交替工作

    对于两个线程交替工作,一个常见的应用场景是控制两个线程按照一定的顺序执行,比如线程A执行一次,然后线程B执行一次,如此循环。以下是一种可能的实现方法: 1. 使用`ManualResetEvent`或`AutoResetEvent`对象...

    linux中一个程序的两个线程的同步(c语言实现)

    Linux 中两个线程的同步(C 语言实现) 在 Linux 操作系统中,多线程编程是非常常见的,但是当多个线程共享同一个资源时,需要确保线程安全,以免出现数据不一致或其他错误。信号灯(Semaphore)是解决这种问题的一...

    两个串口多线程通信

    1. **初始化线程**:创建两个线程,每个线程负责一个串口的读写。可以使用各种编程语言提供的线程库,例如Java的`Thread`类,Python的`threading`模块,或者C++的`std::thread`。 2. **串口配置**:在每个线程启动...

    Java中一个线程执行死循环有什么后果

    标题所提及的场景是一个Java多线程环境,涉及到两个线程——ThreadA和ThreadB,它们分别执行Service类中的methodA()和methodB()方法。这两个方法分别同步在不同的对象上,即object1和object2。在这种情况下,线程A在...

    java程序 两个线程实现学生成绩的读写

    为了启动这两个线程,我们会在主程序中创建它们的实例,然后调用`start()`方法。线程的执行顺序取决于JVM的调度策略,因此可能读线程先执行,也可能写线程先执行。为了避免混乱,可能需要设定一些同步规则,比如使用...

    java多线程之A线程等B、C线程都执行完在执行的结果示例

    在A线程中,我们可以创建一个CountDownLatch,初始化为2(表示B和C两个线程),然后在B和C线程的最后调用countDown()。A线程通过await()方法阻塞自己,直到计数值变为0。 ```java CountDownLatch latch = new ...

    易语言多线程执行任务例程

    接着,使用“启动线程”命令,让这个线程开始执行。 2. **线程同步与通信**:在多线程环境下,线程间的同步和通信是保证程序正确性的关键。易语言提供了如“等待”、“唤醒”、“信号量”等同步机制,用于控制线程...

    在Windows XP下,建立一个包含两个线程,它们分别显示。

    4. **同步机制**:由于两个线程可能会同时操作相同的资源(如UI元素),我们需要使用同步机制来避免竞态条件。Windows API提供了多种同步对象,如事件(Event)、互斥量(Mutex)或临界区(CriticalSection)。在...

    JAVA线程高级-线程按序交替执行

    - `Exchanger`则允许两个线程交换数据,每次只有一个线程可以完成交换,从而实现交替执行。 4. **线程间的通信**: - `wait()`, `notify()`, `notifyAll()`是Object类的方法,用于线程间的通信。一个线程调用`...

    iOS-常驻线程之线程循环调用(两个线程循环交替调用)

    例如,我们可以创建两个串行队列,分别代表两个线程,然后定义一个定时源,让它们交替执行任务。 ```swift let queue1 = DispatchQueue(label: "thread1", qos: .background, attributes: .concurrent) let queue2 ...

    C#线程进程操作

    在IT领域,线程和进程是操作系统中两个重要的概念,特别是在多任务并行处理和并发执行的场景下。本文将详细探讨"操作系统实验之线程与进程"这一主题,主要基于C#编程语言。 首先,我们需要理解进程和线程的基本定义...

    Java实现的两个线程同时运行案例

    在本文中,我们将介绍如何使用Java实现两个线程同时运行的案例,涉及Java多线程相关操作与使用技巧。 Java多线程编程的优点包括: 1. 提高程序的执行效率:多线程编程可以将复杂的任务分解成多个小任务,每个任务...

    实现一个数据单元,包括学号和姓名两部分。编写两个线程,一个线程往数据单元中写,另一个线程往出读。要求每写一次就往出读一次。

    本实验的任务是设计并实现一个数据单元,该单元包含学号和姓名两个字段,并且使用两个线程,一个用于写入数据,另一个用于读取数据。这种设计模式被称为“生产者-消费者”问题,是多线程编程中的经典案例。 首先,...

    MFC两个线程中用事件内核对象通信

    本实例是基于VS2013开发环境,针对Win10 64位系统,展示了如何使用事件内核对象来实现两个线程之间的同步通信。 1. **事件内核对象**:事件内核对象是Windows操作系统提供的一种同步机制,它可以处于已设置...

    C#多线程互斥实例 多线程获取同一变量

    1. **线程**:线程是操作系统分配CPU时间的基本单位,每个线程都有自己的执行路径,它们可以并行或交替执行。 2. **共享资源**:在多线程环境中,多个线程可能需要访问同一个数据或对象,这就形成了共享资源。 3. ...

    多线程之间的线程通信

    互斥锁确保任何时候只有一个线程可以访问共享资源,而读写锁允许多个线程同时进行读操作,但写操作仍然是互斥的。 3. **条件变量(Condition Variable)**:线程可以等待某个特定条件满足后才继续执行,这通常与锁...

    操作系统线程通信课程设计

    1. **多线程任务转换与通信**:在多任务环境下,操作系统可以同时调度多个线程执行不同的任务。线程间的通信是实现任务协调和数据共享的基础。常见的线程通信机制包括共享内存、管道、信号量、消息队列等。 2. **...

Global site tag (gtag.js) - Google Analytics