一、类锁
1.类只有一个,所以锁是类级别的,只有一个
package com.bjpowernode.java_learning;
public class D110_1_ClassLock {
public static void main(String[] args) throws Exception{
Thread t1 = new Thread(new Processor110());
Thread t2 = new Thread(new Processor110());
t1.setName("t1");
t2.setName("t2");
t1.start();
//延迟,保证t1先执行
Thread.sleep(1000);
//下面的方法没有等t1结束,因为这个方法不函数有锁。如果这个方法加上synchronized就会等着t1结束。
t2.start();
//即使是实例化对象了,这个类锁也是有效的,跟对象也没有,底层用的是类锁
}
}
class Processor110 implements Runnable{
public void run() {
if("t1".equals(Thread.currentThread().getName())){
MyClass110.m1();
}
if("t2".equals(Thread.currentThread().getName())){
MyClass110.m2();
}
}
}
class MyClass110{
//synchronized添加到静态方法上,线程执行方法的时候会找类锁。
public synchronized static void m1() {
try {
Thread.sleep(10000);
}catch (Exception e) {
e.printStackTrace();
}
System.out.println("m1......");
}
public static void m2() {
System.out.println("m2......");
}
}
二、死锁现象
package com.bjpowernode.java_learning;
public class D110_2_DeadLock {
public static void main(String[] args) throws Exception{
Object o1 = new Object();
Object o2 = new Object();
Thread t1 = new Thread(new T110(o1,o2));
Thread t2 = new Thread(new T111(o1,o2));
t1.start();
t2.start();
}
}
class T110 implements Runnable{
Object o1;
Object o2;
T110(Object o1,Object o2){
this.o1 = o1;
this.o2 = o2;
}
public void run() {
synchronized(o1) {
try {
Thread.sleep(500);
}catch(Exception e) {
e.printStackTrace();
}
synchronized(o2) {
System.out.println("没有死锁");
}
}
}
}
class T111 implements Runnable{
Object o1;
Object o2;
T111(Object o1,Object o2){
this.o1 = o1;
this.o2 = o2;
}
public void run() {
synchronized(o2) {
try {
Thread.sleep(500);
}catch(Exception e) {
e.printStackTrace();
}
synchronized(o1) {
System.out.println("没有死锁");
}
}
}
}
两个锁死锁了,没办法打印出来“没有死锁”这几个字了。
三、守护线程和用户线程
1.用户线程:以上讲的都是守护线程。
2.守护线程:其他所有的用户线程结束,则守护线程退出;守护线程一般都是无限执行的;守护线程是这样的,所有的用户线程结束生命周期,守护线程才会结束生命周期,只有有一个用户线程存在,那么守护线程就不会结束,例如:java中著名的垃圾回收器就是一个守护线程,只有应用程序中的所有线程都结束,他才会结束。
package com.bjpowernode.java_learning;
public class D110_3_DaemonThread {
public static void main(String[] args) {
Thread t1 = new Processer110_1();
t1.setName("守护线程");
//将t1这个用户线程修改为守护线程
t1.setDaemon(true);
t1.start();
try {
Thread.sleep(1000);
}catch(Exception e) {
e.printStackTrace();
}
for(int i=0;i<10;i++) {
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
}
}
class Processer110_1 extends Thread{
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName()+"-->");
try {
Thread.sleep(500);
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
可以看出来main9之后不会再进行打印打印守护线程,守护线程直接停止了。
四、源码:
D110_1_ClassLock.java
D110_2_DeadLock.java
D110_3_DaemonThread.java
https://github.com/ruigege66/Java/blob/master/D110_1_ClassLock.java
https://github.com/ruigege66/Java/blob/master/D110_2_DeadLock.java
https://github.com/ruigege66/Java/blob/master/D110_3_DaemonThread.java
2.CSDN:https://blog.csdn.net/weixin_44630050
3.博客园:https://www.cnblogs.com/ruigege0000/
4.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料