synchronized 同步方法的无限等待
class MyService{
synchronized public void myMethodA() {
System.out.println("methodA--死循环开始");
boolean flag = true;
while(flag) {}
System.out.println("methodA--死循环结束");
}
synchronized public void myMethodB() {
System.out.println("methodB——开始");
System.out.println("methodB--结束");
}
}
class ThreadA extends Thread{
private MyService myService;
public ThreadA(MyService myService) {
super();
this.myService = myService;
}
@Override
public void run() {
myService.myMethodA();
}
}
class ThreadB extends Thread{
private MyService myService;
public ThreadB(MyService myService) {
super();
this.myService = myService;
}
@Override
public void run() {
myService.myMethodB();
}
}
public class test0 {
public static void main(String[] args) {
MyService myService = new MyService();
Thread a = new ThreadA(myService);
a.setName("a");
a.start();
Thread b = new ThreadB(myService);
b.setName("b");
b.start();
}
}
methodA–死循环开始
修改同步方法 myMethodA()
private Object obj = new Object();
public void myMethodA() {
synchronized(obj){
System.out.println("methodA--死循环开始");
boolean flag = true;
while(flag) {}
System.out.println("methodA--死循环结束");
}
}
methodA–死循环开始
methodB——开始
methodB–结束
但是程序依旧没有停止
多线程的死锁
class ThreadA implements Runnable{
public String username;
private Object obj1 = new Object();
private Object obj2 = new Object();
public void setUsername(String username) {
this.username = username;
}
@Override
public void run() {
if (username.equals("zhangfangxing")) {
synchronized (obj1) {
System.out.println("zhangfangxing obj1 username: " + username + ",threadname:" + Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println("zhangfangxing obj2" + ",threadname: " + Thread.currentThread().getName());
}
}
}
if (username.equals("zfx")) {
synchronized (obj2) {
System.out.println("zfx obj1 username:" + username + ",threadname: " + Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj1) {
System.out.println("zfx obj2" + ",threadname: " + Thread.currentThread().getName());
}
}
}
}
}
public class test1 {
public static void main(String[] args) {
ThreadA a = new ThreadA();
a.setUsername("zhangfangxing");
Thread t1 = new Thread(a);
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
a.setUsername("zfx");
Thread t2 = new Thread(a);
t2.start();
}
}
zhangfangxing obj1 username: zhangfangxing,threadname:Thread-0
zfx obj1 username:zfx,threadname: Thread-1
- Java 源生自带的工具,其地址在 $JAVA_HOME/bin 目录下。
- jps(Java Virtual Machine Process Status Tool) 是 java 提供的一个显示当前所有 java 进程 pid 的命令,适合在 linux/unix 平台上简单察看当前 java 进程的一些简单情况。
- jstack 是 JDK 自带的线程堆栈分析工具,使用该命令可以查看或导出 Java 应用程序中线程堆栈信息。