A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

曾炜良

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 曾炜良 初级黑马   /  2018-4-22 23:01  /  2219 人查看  /  29 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*
第一种案例
*/
public classSellTicketDemo {
publicstatic void main(String[] args) {
// 创建资源对象
SellTicketst = new SellTicket();
// 创建三个线程对象
Thread t1 = new Thread(st, "窗口1");
Thread t2 = new Thread(st, "窗口2");
Thread t3 = new Thread(st, "窗口3");
// 启动线程
t1.start();
t2.start();
t3.start();
}
}
public classSellTicket implements Runnable {
// 定义100张票
privateint tickets = 100;
// 定义同一把锁
privateDemo d = new Demo();
private int x=0;
//同步代码块用任意对象做锁
@Override
publicvoid run() {
while(true) {
if(x%2==0){
synchronized (this){
if(tickets > 0) {
try{
Thread.sleep(100);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票");
}
}
}else{
sellTicket();//如果这样都是没什么问题
}
x++;
}
}
//如果一个方法一进去就看到了代码被同步了,那么我就在想能不能把这个同步加在方法上呢?
private synchronized  void sellTicket(){
if(tickets > 0) {
try{
Thread.sleep(100);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票");
}
}

}
/*
第2种方式
*/
public classSellTicketDemo {
publicstatic void main(String[] args) {
// 创建资源对象
SellTicketst = new SellTicket();
// 创建三个线程对象
Thread t1 = new Thread(st, "窗口1");
Thread t2 = new Thread(st, "窗口2");
Thread t3 = new Thread(st, "窗口3");
// 启动线程
t1.start();
t2.start();
t3.start();
}
}
public classSellTicket implements Runnable {
// 定义100张票
privatestatic int tickets = 100;
// 定义同一把锁
privateDemo d = new Demo();
private int x=0;
//同步代码块用任意对象做锁
@Override
publicvoid run() {
while(true) {
if(x%2==0){
synchronized (SellTicket .class) {
if(tickets > 0) {
try{
Thread.sleep(100);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票");
}
}
}else{
sellTicket();//如果这样都是没什么问题
}
x++;
}
}
//如果一个方法一进去就看到了代码被同步了,那么我就在想能不能把这个同步加在方法上呢?
private static synchronized  void sellTicket(){
if(tickets > 0) {
try{
Thread.sleep(100);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票");
}
}

}
synchronized有2种方式:一种是同步代码块,另一种是同步方法.而最重要的是sybchronized的锁是什么对象?一般都是所在的类
同步代码块和同步方法不是互不干涉的.
1.synchronized(this)对应的是类中的public synchronized void xxxx().
2.synchronized(类.class)对应的是类中的public static synchronized void xxxx().
如果有这2种对应的话,就会互相干扰

29 个回复

倒序浏览
不错不错
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
gzgd 高级黑马 2018-10-9 10:29:46
7#
回复 使用道具 举报
gzgd 高级黑马 2018-10-9 10:29:49
8#
回复 使用道具 举报
gzgd 高级黑马 2018-10-9 10:29:56
9#
回复 使用道具 举报
gzgd 高级黑马 2018-10-9 10:29:58
10#
回复 使用道具 举报
gzgd 高级黑马 2018-10-9 10:30:02
11#
回复 使用道具 举报
gzgd 高级黑马 2018-10-9 10:30:05
12#
回复 使用道具 举报
gzgd 高级黑马 2018-10-9 10:30:08
13#
回复 使用道具 举报
gzgd 高级黑马 2018-10-9 10:30:10
14#
回复 使用道具 举报
加油,同学
回复 使用道具 举报
可以可以
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马