欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

同步块:synchronized(同步监视器对象){同步运行代码片段}

程序员文章站 2022-06-11 16:19:12
package seday10; import seday03.Test2; /** * @author xingsir * 同步块: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();
}
}

}