多线程的真正意义所在
比如在一个main主线程中,有一个耗时的IO操作,或者一个需要用户交互的IO操作,
如果没有多线程,只有一个main主线程,那么main中用户交互的IO操作后面的代码就必须等待用户操作之后才会执行,
如果有了多线程,那么在等待用户操作的同时,可以去执行其他的线程
如:利用多线程相应一个用户的请求时,可以同时响应其他用户的请求,
如果将代码全部写在一个main主线程中,那么就必须等待响应完第一个用户后才能对其他的用户做出响应
锁
锁是针对使用同一个对象(资源)来使用的,
例如两个线程锁的同一个对象时,那么不管线程时间长短,都会按照顺序执行
当不使用锁的时候就会按照CPU调度(根据线程时间长短决定)来执行线程
所以说锁说白了就是为了使线程在利用同一资源时可以合理安排,而不会产生并发问题
锁的对象
锁的对象包括类和类的Class模板
当方法中没有加static时,那么锁的就是new出来的一个类的实例对象,此时不管new出来多少个实例,锁的还是同一个对象
当方法中加了static时,那么锁的就是类的Class模板
package com.yangdaxian.juc;
import java.util.concurrent.TimeUnit;
public class Juc {
public static void main(String[] args) throws InterruptedException {
Phone phone1 = new Phone();
Phone phone2 = new Phone();
new Thread(()->{
try {
Phone.msg();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
TimeUnit.SECONDS.sleep(2);
new Thread(()->{
try {
phone1.call();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(()->{phone2.shiP();}).start();
}
}
class Phone{
public static synchronized void msg() throws InterruptedException {
System.out.println("send a message");
TimeUnit.SECONDS.sleep(2);
}
public synchronized void call() throws InterruptedException {
System.out.println("make a call");
TimeUnit.SECONDS.sleep(3);
}
public synchronized void shiP(){
System.out.println("shi ping");
}
}