public class Apple {
private int color;
public Apple(int color)
{
this.color = color;
}
public int getColor() {
return color;
}
//终止于这步
public synchroized void setColor(int color) {
this.color = color;
}
}
public class TestDeadLock implements Runnable{
int flag = 1;
static Apple o1 = (Apple) new Apple(3); //资源1,也称为锁
static Apple o2 = (Apple) new Apple(3); //资源2,也称为锁
public static void main(String[] args) {
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 1;
td2.flag = 0;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.start();
t2.start();
}
public void run() {
if(flag == 1){
synchronized(o1) //判断括号内对象是否在其他线程中锁定
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
o2.setColor(8); //发生死锁
System.out.println("2:" + o2.getColor());
}
}
if(flag == 0){
synchronized(o2){
System.out.println("1:" + o2.getColor());
synchronized(o1){
System.out.println("t2 succeed");
}
}
}
}
}
当 Apple 类中setColor()方法前没有synchronized,则输出如下:
1:3
2:8
t2 succeed
当该方法前有synchronized,则构成了死锁。
由此可见:
(1)锁对象本身是可以修改的。
(2)当给一个方法前加上synchronized,则相当于synchronized(该方法所属的对象)。
(3)synchronized(锁)该语句会判断这个锁是否在某处已用,如果用,那么就阻塞当前线程。
分享到:
相关推荐
synchronized关键字在Java中扮演着重要的角色,它是Java实现同步的基础,确保了多线程环境下的数据一致性。不同于基于JDK实现的Lock接口(如ReentrantLock),synchronized是直接由JVM支持的,其底层依赖于操作系统...
- **同步代码块**更灵活,可以指定锁对象,并且只对特定代码进行同步,减少锁的粒度,提高并发性能。 - **同步方法**锁住的是对象本身,所有对该对象的synchronized方法调用都会互斥。如果一个类的所有方法都需要...
2. Java中没有goto语句。 3. “&”是逻辑与操作符,用于所有情况的逻辑运算;“&&”是短路与操作符,仅在第一个条件为false时才会计算第二个条件。 4. Java中跳出多重循环通常使用标签(label)配合break语句。 5. ...
Java基础知识讲解与面试题分析: 1. Java源文件中是否可以...Java中可以通过继承Thread类、实现Runnable接口以及使用Callable接口和FutureTask类来实现多线程。同步可以通过synchronized关键字或者显式锁Lock类实现。
- Java中的访问修饰符,用来控制类、接口、变量、方法和构造器的访问级别。 1.25 Object - Object是Java类层次结构的根类,所有Java类都直接或间接继承自Object类。 1.26 equals和==的区别 - ==用于比较两个对象的...
Synchronized 锁对象是 Java 虚拟机中的一种同步机制,可以实现同步锁。Synchronized 锁对象可以分为两部分:Java 对象内存布局和 Java 锁结构信息。 3.1、Java 对象内存布局 Java 对象内存布局是指 Java 对象在...
`synchronized`还可以用来修饰代码块,指定一个同步监视器(通常是对象实例本身),只有获得了该监视器的锁,才能执行代码块内的代码。这种方式更为灵活,可以根据实际需求控制锁的范围。示例代码如下: ```java ...
- 内部类可以避免修改接口而实现同一个类中两种同名方法的调用。 4. **继承**: - 子类可以从父类继承public和protected修饰的属性和方法,无论子类和父类是否在同一个包内。 - 子类还可以继承默认权限修饰符修饰...
Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,...
10. final关键字用于修饰变量时,表示变量一旦被赋值后,其引用不能被改变,但引用的对象可以是可变的。 11. “==”比较的是引用是否相同,而equals方法比较的是对象的内容是否相同。 12. 静态变量属于类本身,而...
- **同步代码块**:可以指定锁对象,锁的是给定的对象,提供了更大的灵活性。 3. **synchronized的实现** - 在Java中,每个对象都有一个监视器锁(monitor)。当监视器锁被占用时,对象进入锁定状态,线程执行`...
本文主要围绕Java面试中常...通过反射,可以获取类的元数据,访问和修改类及对象的属性,调用方法,加载类等。 以上知识点是Java程序员在面试中常被问及的内容,掌握这些知识点对于通过Java相关职位的面试至关重要。
控制反转(Inversion of Control,IoC)是一种设计模式,它提倡将对象的创建、组装和管理责任交给外部容器,而不是由对象本身来管理。在Spring框架中,这种模式通过依赖注入(Dependency Injection,DI)来实现。 #...
在Java中,可以通过查找书签并替换其内容来实现动态数据插入。例如,在Apache POI中,可以使用`XWPFDocument`的`getBookmarks()`方法获取文档中的所有书签,然后使用`XWPFBookmark`对象的`getBody()`或`getPart()`...
在多线程环境下,为了避免多个线程同时修改同一个资源而导致的数据不一致问题,可以使用对象锁(synchronized关键字)来实现对共享资源的互斥访问。`synchronized`可以作用于方法或者代码块,确保同一时间只有一个...
5. switch语句在Java中可以用于byte和short类型以及枚举类型(Java 5之后),但是不可以用于long和String类型。不过,可以通过String类的valueOf()方法将字符串转换为字符序列后使用。 6. 对于short类型变量的运算...
在Java中,使用`break`关键字配合标签(label)可以跳出多重循环,例如`break label;`。 5. **Java数据类型**: Java的数据类型分为两类:基本数据类型(如int、char、boolean)和引用数据类型(如类、接口和数组...
修饰对象引用时,引用变量不可指向其他对象,但是对象本身的内容是可以修改的。 11. "=="和equals方法究竟有什么区别? "=="比较的是两个变量的引用是否相同,即它们是否指向内存中的同一个位置;equals方法默认...