package com.example.threaddesign;
/**
* @author Dongguabai
* @date 2018/12/4 17:33
*/
public class SynchronizedTest2 {
private static final Object LOCK = new Object();
public static void main(String[] args) {
TTe task2 = new TTe();
Thread t1 = new Thread(task2);
Thread t2 = new Thread(task2);
Thread t3 = new Thread(task2);
t1.start();
t2.start();
t3.start();
}
}
package com.example.threaddesign;
/**
* @author Dongguabai
* @date 2018/12/4 18:09
*/
public class TTe implements Runnable {
private final Object MONITOR = new Object();
@Override
public void run() {
while (true) {
//1
synchronized (MONITOR) {
try {
Thread.sleep(1000_1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
通过 jconsole 可以看到线程的一些信息:
可以看出是 Thread-0 获得了锁。
再使用 jstack 看看:
"Thread-2" #13 prio=5 os_prio=0 tid=0x0000000019476800 nid=0x18ec waiting for monitor entry [0x000000001a03f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.example.threaddesign.SynchronizedTest2$Task2.run(SynchronizedTest2.java:27)
- waiting to lock <0x00000000d61f5da8> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:745)
"Thread-1" #12 prio=5 os_prio=0 tid=0x0000000019475800 nid=0x3708 waiting for monitor entry [0x0000000019f3f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.example.threaddesign.SynchronizedTest2$Task2.run(SynchronizedTest2.java:27)
- waiting to lock <0x00000000d61f5da8> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:745)
"Thread-0" #11 prio=5 os_prio=0 tid=0x0000000019473000 nid=0x27f8 waiting on condition [0x0000000019e3e000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.example.threaddesign.SynchronizedTest2$Task2.run(SynchronizedTest2.java:27)
- locked <0x00000000d61f5da8> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:745)
也可以看出是 Thread-0 获得了锁,那个锁是一个 monitor。
看看 TTe 的汇编指令:
汇编指令为:
C:\Users\Dongguabai>cd H:\idea_home\demoClient\src\main\java\com\example\threaddesign
C:\Users\Dongguabai>h:
H:\idea_home\demoClient\src\main\java\com\example\threaddesign>javac TTe.class
javac: 无效的标记: TTe.class
用法: javac
-help 用于列出可能的选项
H:\idea_home\demoClient\src\main\java\com\example\threaddesign>javac TTe.java
H:\idea_home\demoClient\src\main\java\com\example\threaddesign>javap -c TTe
警告: 二进制文件TTe包含com.example.threaddesign.TTe
Compiled from "TTe.java"
public class com.example.threaddesign.TTe implements java.lang.Runnable {
public com.example.threaddesign.TTe();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()V
4: aload_0
5: new #2 // class java/lang/Object
8: dup
9: invokespecial #1 // Method java/lang/Object."":()V
12: putfield #3 // Field MONITOR:Ljava/lang/Object;
15: return
public void run();
Code:
0: aload_0
1: getfield #3 // Field MONITOR:Ljava/lang/Object;
4: dup
5: astore_1
6: monitorenter
7: ldc2_w #4 // long 10001000l
10: invokestatic #6 // Method java/lang/Thread.sleep:(J)V
13: goto 21
16: astore_2
17: aload_2
18: invokevirtual #8 // Method java/lang/InterruptedException.printStackTrace:()V
21: aload_1
22: monitorexit
23: goto 31
26: astore_3
27: aload_1
28: monitorexit
29: aload_3
30: athrow
31: goto 0
Exception table:
from to target type
7 13 16 Class java/lang/InterruptedException
7 23 26 any
26 29 26 any
}
package com.example.threaddesign;
/**
* @author Dongguabai
* @date 2018/12/5 14:36
*/
public class SynchronizedTest3 {
private static Object lock = null;
public static void main(String[] args) {
new Thread(()->{
add();
},"线程一").start();
new Thread(()->{
add();
},"线程二").start();
new Thread(()->{
add();
},"线程三").start();
}
public static void add(){
synchronized (lock){
System.out.println(Thread.currentThread().getName()+"-->进入了锁----");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-->出锁----");
}
}
}
运行结果:
Exception in thread "线程一" Exception in thread "线程二" java.lang.NullPointerException
at com.example.threaddesign.SynchronizedTest3.add(SynchronizedTest3.java:24)
at com.example.threaddesign.SynchronizedTest3.lambda$main$0(SynchronizedTest3.java:13)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "线程三" java.lang.NullPointerException
at com.example.threaddesign.SynchronizedTest3.add(SynchronizedTest3.java:24)
at com.example.threaddesign.SynchronizedTest3.lambda$main$1(SynchronizedTest3.java:16)
at java.lang.Thread.run(Thread.java:745)
java.lang.NullPointerException
at com.example.threaddesign.SynchronizedTest3.add(SynchronizedTest3.java:24)
at com.example.threaddesign.SynchronizedTest3.lambda$main$2(SynchronizedTest3.java:19)
at java.lang.Thread.run(Thread.java:745)
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000777c3290, pid=5632, tid=6656
#
# JRE version: Java(TM) SE Ru
Spring 中提供一些Aware相关de接口,BeanFactoryAware、 ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等,其中最常用到de匙ApplicationContextAware.实现ApplicationContextAwaredeBean,在Bean被初始后,将会被注入 Applicati
在Java项目中,我们通常会自己写一个DateUtil类,处理日期和字符串的转换,如下所示:
public class DateUtil01 {
private SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public void format(Date d
问题描述:
在实现类中的某一或某几个Override方法发生编译错误如下:
Name clash: The method put(String) of type XXXServiceImpl has the same erasure as put(String) of type XXXService but does not override it
当去掉@Over