23.创建一个简单的多线程程序,模拟多个线程同时访问共享资源的情况
java复制代码
public class SharedResource { | |
private int sharedValue = 0; | |
public synchronized void increment() { | |
sharedValue++; | |
System.out.println("Incremented value: " + sharedValue); | |
} | |
public synchronized void decrement() { | |
sharedValue--; | |
System.out.println("Decremented value: " + sharedValue); | |
} | |
public int getValue() { | |
return sharedValue; | |
} | |
} | |
class IncrementThread extends Thread { | |
private SharedResource sharedResource; | |
public IncrementThread(SharedResource sharedResource) { | |
this.sharedResource = sharedResource; | |
} | |
@Override | |
public void run() { | |
for (int i = 0; i < 10; i++) { | |
sharedResource.increment(); | |
try { | |
Thread.sleep(100); // Simulate some delay | |
} catch (InterruptedException e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
} | |
class DecrementThread extends Thread { | |
private SharedResource sharedResource; | |
public DecrementThread(SharedResource sharedResource) { | |
this.sharedResource = sharedResource; | |
} | |
@Override | |
public void run() { | |
for (int i = 0; i < 10; i++) { | |
sharedResource.decrement(); | |
try { | |
Thread.sleep(100); // Simulate some delay | |
} catch (InterruptedException e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
} | |
public class Main { | |
public static void main(String[] args) { | |
SharedResource sharedResource = new SharedResource(); | |
IncrementThread incrementThread = new IncrementThread(sharedResource); | |
DecrementThread decrementThread = new DecrementThread(sharedResource); | |
incrementThread.start(); | |
decrementThread.start(); | |
} | |
} |
这个程序创建了一个SharedResource
类,它有一个共享的整型变量sharedValue
。increment
和decrement
方法用于增加和减少这个变量的值,并且这两个方法都被声明为synchronized
,以确保同一时间只有一个线程能够访问这些方法。
然后,我们创建了两个线程类IncrementThread
和DecrementThread
,它们分别用于增加和减少sharedValue
的值。
在main
方法中,我们创建了一个SharedResource
对象,然后创建了两个线程并启动它们。这样,这两个线程就会同时访问并修改sharedValue
的值。
注意,虽然这个示例程序使用了synchronized
关键字来确保线程安全,但在实际的多线程编程中,可能还需要考虑其他更复杂的问题,如死锁、活锁、饥饿等问题。同时,Java也提供了其他的并发工具,如ReentrantLock
、Semaphore
、CountDownLatch
等,可以更加灵活地控制线程的行为。