同步块:synchronized(同步监视器对象){同步运行代码片段}
package seday10;
import seday03.test2;
/**
* @author xingsir
* 同步块:synchronized(同步监视器对象){需要同步运行的代码片段}
* 同步块可以更准确的控制需要同步运行的代码片段,有效的缩小同步范围可以保证并发安全的前提下尽可能的提高并发 的效率。
*/
public class syncdemo2 {
public static void main(string[] args) {
eat eat =new eat();//实例化一个对象eat
thread t1=new thread() {//创建线程一
public void run() {
eat.order();//调用
}
};
thread t2=new thread() {//创建线程二一
public void run() {
eat.order();//调用
}
};
t1.start();//线程调用
t2.start();//线程调用
}
}
/*
* 若不使用,synchronized (this) {},结果如下:
thread-1:开始浏览菜单。。。。。
thread-0:开始浏览菜单。。。。。
thread-1:服务员点餐...
thread-0:服务员点餐...
thread-1:上菜开吃!
thread-0:上菜开吃!
假设就一个服务员的话,就存在问题
*/
/*使用,synchronized (this) {}。执行结果:可以看出线程thread-1处理完后thread-0才开始处理
thread-1:开始浏览菜单。。。。。
thread-0:开始浏览菜单。。。。。
thread-1:服务员点餐...
thread-1:上菜开吃!
thread-0:服务员点餐...
thread-0:上菜开吃!
*/
class eat{
public void order() {
thread thread=thread.currentthread();//主进程
try {
system.out.println(thread.getname()+":开始浏览菜单。。。。。");
thread.sleep(5000);//阻塞5000毫秒
//服务员就一个点餐需要排队,所以
synchronized (this) {//this为同步监视器对象,所以需要同步运行的代码片段
system.out.println(thread.getname()+":服务员点餐...");//打印出线程名字
thread.sleep(5000);//阻塞5000毫秒
}
system.out.println(thread.getname()+":上菜开吃!");//打印出线程名字
} catch (exception e) {
e.printstacktrace();
}
}
}
上一篇: 语言特性
下一篇: 删除排序数组中的重复数据