1) 编写SynchronizedMethodDemo类,该类实现Runnable接口,并生成main()方法。 2) 在该类下定义一个共享整型变量int number=0;然后重写run方法,要求使用非同步方法和同步方法两种方式循环输出5次number自增值,每输出一个值休眠0.1秒,并输出线程的名称。 3) 运行并查看非同步和同步后的结果。 4) 编写SynchronizedBlockDemo类,该类实现Runnable接口,并生成main()方法。 5) 在该类下定义一个共享整型变量int number=0;然后重写run方法,要求使用非同步块和同步块两种方法循环输出5次number自增值,每输出一个值休眠0.1秒,并输出线程的名称。
时间: 2024-03-11 17:47:42 浏览: 19
很抱歉,我作为一名语言模型,无法为您编写代码,但我可以为您提供思路和代码示例。
SynchronizedMethodDemo代码示例:
```java
public class SynchronizedMethodDemo implements Runnable {
private int number = 0;
// 非同步方法
public void printNumber() {
for (int i = 0; i < 5; i++) {
number++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": " + number);
}
}
// 同步方法
public synchronized void synchronizedPrintNumber() {
for (int i = 0; i < 5; i++) {
number++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": " + number);
}
}
@Override
public void run() {
if (Thread.currentThread().getName().equals("Thread-1")) {
printNumber();
} else {
synchronizedPrintNumber();
}
}
public static void main(String[] args) {
SynchronizedMethodDemo demo = new SynchronizedMethodDemo();
new Thread(demo, "Thread-1").start();
new Thread(demo, "Thread-2").start();
}
}
```
SynchronizedBlockDemo代码示例:
```java
public class SynchronizedBlockDemo implements Runnable {
private int number = 0;
// 非同步块
public void printNumber() {
synchronized (this) {
for (int i = 0; i < 5; i++) {
number++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": " + number);
}
}
}
// 同步块
public void synchronizedPrintNumber() {
synchronized (this) {
for (int i = 0; i < 5; i++) {
number++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": " + number);
}
}
}
@Override
public void run() {
if (Thread.currentThread().getName().equals("Thread-1")) {
printNumber();
} else {
synchronizedPrintNumber();
}
}
public static void main(String[] args) {
SynchronizedBlockDemo demo = new SynchronizedBlockDemo();
new Thread(demo, "Thread-1").start();
new Thread(demo, "Thread-2").start();
}
}
```
运行以上两个类,可以看到使用同步方法或同步块的输出结果是顺序的,而非同步的输出结果是无序的。这是因为同步方法和同步块可以确保多个线程在访问共享资源时的有序性,避免了竞态条件的发生。