您的位置:首页 > 编程语言 > Java开发

JavaSE8基础 多线程synchronized 同步静态方法的锁

2017-10-08 22:39 375 查看
礼悟:
公恒学思合行悟,尊师重道存感恩。叶见寻根三返一,江河湖海同一体。
虚怀若谷良心主,愿行无悔给最苦。读书锻炼养身心,诚劝且行且珍惜。

os :windows7 x64
jdk:jdk-8u131-windows-x64
ide:Eclipse Oxygen Release (4.7.0)


Runnable接口实现类:

package blog.jizuiku7;

/*
* @author jizuiku
* @version V17.09.27
*/
public class SellTicket implements Runnable {

// 因为静态方法中会用到ticket变量,所以需要加上static
private static int ticket = 100;
private boolean flag = true;

@Override
public void run() {
// TODO Auto-generated method stub
while (true) {

// 加个延迟,一来是模拟网络延迟
// 二来是 可以更好体现多线程的特点
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

if (flag) {
// 锁对象是同一个的时候,共享资源才可以处理妥当
synchronized (SellTicket.class) {
if (ticket > 0) {
System.out.println(Thread.currentThread().getName() + ":" + "正在卖出No." + (ticket--));
}
}
} else {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronizedFunction();
}
// 翻转标志
flag = !flag;

}
}

// 这里没有指明锁对象
// 锁对象可以使任意对象
// this也可以,可是!!!这是一个静态方法,用不了this呀!
// 那么 静态方法的 锁是啥?
// "类名.class" 风清扬老师如是说道.
// class文件已生,而静态函数才生
private static synchronized void synchronizedFunction() {

if (ticket > 0) {
System.out.println(Thread.currentThread().getName() + ":" + "正在卖出No." + (ticket--));
}
}

}


测试类:

package blog.jizuiku7;

/*
* @author jizuiku
* @version V17.09.27
*/
public class SellTicketDemo {
public static void main(String[] args) {
SellTicket stWindow = new SellTicket();

Thread stWindow1 = new Thread(stWindow, "售票窗口_0");
Thread stWindow2 = new Thread(stWindow, "售票窗口_1");
Thread stWindow3 = new Thread(stWindow, "售票窗口_2");

stWindow1.start();
stWindow2.start();
stWindow3.start();
}
}


结果:



Java优秀,值得学习。
学习资源:itcast和itheima视频库。如果您有公开的资源,可以分享给我的话,用您的资源学习也可以。
博文是观看视频后,融入思考写成的。博文好,是老师讲得好。博文坏,是 给最苦 没认真。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐