awit和sleep的区别
从名称上来讲:
awit:等待。
sleep:休眠。 从属关系上来讲:
awit:awit这个方法是在对象上,只要是对象,就有这个方法
sleep:sleep是在Thread上,它是在线程上,是一个静态方法使用方式上来讲:
awit只能够在同步代码中去使用
sleep可以在任意的地方中去使用从阻塞时间上来讲:
awit需要等待别人。如果别人没有执行完,它是不能够干其他的事情的。
它会有一个超时时间,什么是超时时间呢?
我等待的时间太长了,时间太长了, 我就不能够再等待了。这个时候就会发生异常。会有异常
sleep:它会有一个休眠时间,这个休眠时间不会有任何的问题。
休眠完一定的时间,它自己就会醒过来。 不会有异常。同步处理:
awit:如果执行awit方法,其他线程会有机会执行当前的同步操作。
sleep:如果执行sleep方法,那么其他线程没有机会执行当前的同步操作。
线程的安全性问题
所谓的线程安全性问题:其实就是多个线程在并发执行时,修改了共享内存中共享对象的属性,导致的数据冲突问题。
我们可以通过下面的来理解
package part;
public class Java01 {public static void main(String[] args) {User u1 = new User();// Lambda表达式Thread t1 = new Thread(()->{u1.name ="张三";try {// 休眠1s钟后再去执行代码Thread.sleep(1000);// 休眠语句会让后面的代码等待,也就是说:休眠语句会让后面的打印语句等待1s钟后再执行} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("输出语句"+u1.name);});Thread t2 = new Thread(()->{u1.name ="李四";try {// 休眠1s钟后再去执行代码Thread.sleep(1000);// 休眠语句会让后面的代码等待,也就是说:休眠语句会让后面的打印语句等待1s钟后再执行} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("输出语句"+u1.name);});t1.start();t2.start();}
}
class User{String name;
}
//输出语句李四
//输出语句李四
解释1
为啥会输出2个李四呢?
因为:他们的对象u1是同一个。
张三线程把u1对象的名称更改为了张三,然后休眠。
与此同时,李四线程把u1对象的名称更改为了李四。然后休眠。
等待休眠结束:u1的对象名称都是李四了。
因此:输出2个李四
2个线程指向的是同一个对象哈。也就是2个线程打印的是同一个对象。
特别提醒:
java 会对每一个线程创建一个[栈内存],他们之间互相独立,互不影响。
解释2
为啥会输出2个李四呢?
代码中的u1是共享对象,两个线程同时修改它的name属性,没有同步机制,所以会出现竞态条件。
比如,t1设置name为“张三”,然后休眠,这时候t2可能将name改为“李四”。
然后两个线程都休眠结束后,所以打印的时候可能都看到“李四”。
也就是说:最后的name值取决于最后修改的那个线程。
尾声
准备开始学习java了。
今天学习的第九天,每天都会发文章,我要卷起来。
请小伙伴们监督我,奥利给