.写代码验证对象锁的下列特点,并将代码以压缩包形式发给我。 1.对于不同对象,对象锁没有作用 2.当一个线程访问synchronized修饰的成员方法或者修饰的代码块时,其他线程无法访问synchronized修饰的其他成员方法或修饰的其他代码块 3.但是2中的情况对没有synchronized修饰的其他方法没有效果
时间: 2024-04-10 19:34:37 浏览: 42
以下是验证对象锁特点的代码示例,你可以将其保存为一个压缩包并下载:
```java
// ObjectLockExample.java
public class ObjectLockExample {
public static void main(String[] args) {
ObjectLockExample example = new ObjectLockExample();
Thread thread1 = new Thread(() -> example.method1());
Thread thread2 = new Thread(() -> example.method2());
Thread thread3 = new Thread(() -> example.method3());
thread1.start();
thread2.start();
thread3.start();
}
public synchronized void method1() {
System.out.println("Method 1 - Start");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Method 1 - End");
}
public void method2() {
synchronized (this) {
System.out.println("Method 2 - Start");
System.out.println("Method 2 - End");
}
}
public void method3() {
System.out.println("Method 3 - Start");
System.out.println("Method 3 - End");
}
}
```
这个示例代码展示了对象锁的三个特点:
1. 对于不同对象,对象锁没有作用:在`ObjectLockExample`类中创建了一个实例`example`,然后启动了三个线程分别调用`method1`、`method2`和`method3`方法。由于这三个线程操作的是同一个实例`example`,所以对象锁会起作用,但如果使用不同的实例则对象锁不会影响彼此。
2. 当一个线程访问`synchronized`修饰的成员方法或者修饰的代码块时,其他线程无法访问`synchronized`修饰的其他成员方法或修饰的其他代码块:在`method1`中使用了`synchronized`修饰整个方法,因此一旦线程获取到对象锁,其他线程无法同时访问该方法。在`method2`中使用了`synchronized`修饰代码块,同样会对其他线程产生阻塞。
3. 但是对没有`synchronized`修饰的其他方法没有效果:在`method3`中没有使用`synchronized`修饰,所以即使其他线程在访问带有对象锁的方法时被阻塞,仍然可以同时访问没有对象锁的方法。
你可以将以上代码保存为一个Java文件并编译运行,然后将编译后的class文件和源代码文件打包成一个压缩包进行发送。
阅读全文