public class Shop
{
public static void main(String[] args)
{
Outer o=new Outer();
Thread t1=o.getSale("T1 ");
Thread t2=o.getSale("T2 ");
/*Thread t1=new Thread(o,"T1");
Thread t2=new Thread(o,"T2");*/
t1.start();
t2.start();
System.out.println(Thread.currentThread().getName()); } }
class Outer
{
Object temp=new Object();
private int ticket=100;
public Thread getSale(String s)
{
return new Sale(s);
} class Sale extends Thread//implements Runnable//
{ Sale(String s)
{
super(s); }
public void run()
{ while(ticket>0)
{
try
{
Thread.currentThread().sleep(10);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
saletTicket(getName());
} }
private void saletTicket(String s)
{
synchronized (temp)
{
if(ticket>0)
{
System.out.println(getName()+" ticket "+ticket--);
//ticket=tmp;
} } } }
} /*public class Shop {
public static void main(String[] args) {
Outer o = new Outer();
o.getSale("s1:").start();
o.getSale("s2:").start();
}
} class Outer {
private int ticket = 100; public Thread getSale(String s) { return new Sale(s);
} private class Sale extends Thread {
Sale(String s) {
super(s);
} public void run() {
while(ticket > 0){ try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
ticket(getName());
}
}
} public synchronized void ticket(String name){
if (ticket > 0) {
System.out.println(name + " ticket " + ticket--);
}
}
}*/

错误代码如下,这样只会让先抢到资源的线程执行到底。循环应放置在同步区外部

public class Shop
{
public static void main(String[] args)
{
Outer o=new Outer();
Thread t1=o.getSale("T1 ");
Thread t2=o.getSale("T2 ");
Thread t1=new Thread(o,"T1");
Thread t2=new Thread(o,"T2");
t1.start();
t2.start();
System.out.println(Thread.currentThread().getName()); } }
class Outer
{
Object temp=new Object();
private int ticket=100;
public Thread getSale(String s)
{
return new Sale(s);
} class Sale extends Thread//implements Runnable//
{ Sale(String s)
{
super(s); }
public void run()
{ try
{
Thread.currentThread().sleep(10);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} saletTicket(getName()); }
private void saletTicket(String s)
{
synchronized (temp)
{
while(ticket>0)
{
System.out.println(getName()+" ticket "+ticket--);
//ticket=tmp;
} } } }
}

java——多线程——内部类共享同一个外部类对象的成员变量的更多相关文章

  1. 141、Java内部类之实例化外部类对象

    01. 代码如下: package TIANPAN; class Outer { // 外部类 private static String msg = "Hello World !" ...

  2. Java中内部类揭秘(一):外部类与非静态内部类的”相互可见性“

               声明:本博客为原创博客.未经同意,不得转载.原文链接为 http://blog.csdn.net/bettarwang/article/details/27012421.     ...

  3. 深入理解Java中为什么内部类可以访问外部类的成员

    内部类简介 虽然Java是一门相对比较简单的编程语言,但是对于初学者, 还是有很多东西感觉云里雾里, 理解的不是很清晰.内部类就是一个经常让初学者感到迷惑的特性. 即使现在我自认为Java学的不错了, ...

  4. 继承内部类时使用外部类对象.super()调用内部类的构造方法

    问题简介   今天在看<Java编程思想>的时候,看到了一个很特殊的语法,懵逼了半天--一个派生类继承自一个内部类,想要创建这个派生类的对象,首先得创建其父类的对象,也就是这个内部类,而调 ...

  5. 牛客网Java刷题知识点之关键字static、static成员变量、static成员方法、static代码块和static内部类

    不多说,直接上干货! 牛客网Java刷题知识点之关键字static static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中st ...

  6. “全栈2019”Java第七十五章:内部类持有外部类对象

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. 牛客网Java刷题知识点之什么是内部类、为什么要使用内部类、内部类如何使用外部类的属性和方法、成员内部类、局部内部类、静态内部类、匿名内部类

    不多说,直接上干货! 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 内部类 ...

  8. “全栈2019”Java第八十二章:嵌套接口能否访问外部类中的成员?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. C++中内部类访问外部类的私有成员

    首先,如果不知道什么是内部类InnerClass的话,就没必要往下看了. 尝试在C++中模仿apple objective-c 的Grand Dispatch简化多线程编程时,使用了boost::fu ...

随机推荐

  1. wini -- FileSubmitByFTP

    // winFtpPutFiles.cpp : Defines the entry point for the console application.// #include "stdafx ...

  2. adb devices 不识别设备(或者偶尔识别设备) -破解

    问题:当在CMD中输入adb devices时,没有设备信息显示,居然显示下面的信息 问题是有时候可以识别,有时候不可以识别.当被别人连接后,自己在连接是好的,过了一会以后又不好了

  3. python学习笔记(一):作图

    1.需要导入的包 import seaborn as sns import numpy as np from numpy.random import randn import matplotlib a ...

  4. (转)oracle中用户删除不了,ORA-01940提示 “无法删除当前已连接用户”

    Oracle删除用户的提示无法删除当前已连接用户两种解决方法如下: 1.先锁定用户.然后查询进程号,最后删除对应的进程.在删除对应的用户 SQLalter user XXX account lock; ...

  5. 深入理解Java虚拟机(一)、Java内存区域与内存溢出异常

    Java虚拟机所管理的内存包括以下几个运行时数据区: 程序计数器(PCR): 1.是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器 2.为线程私有 3.执行Java方法有PCR,执行 ...

  6. .net多线程

    线程 线程池 异步 异步更新winform界面 线程同步

  7. 搭建高可用mongodb集群(三)—— 深入副本集内部机制

    在上一篇文章<搭建高可用mongodb集群(二)—— 副本集> 介绍了副本集的配置,这篇文章深入研究一下副本集的内部机制.还是带着副本集的问题来看吧! 副本集故障转移,主节点是如何选举的? ...

  8. 关于 Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause() 错误

    最近在做项目的时候发现一个如题的控制台报错. 一看右侧的报错文件是undefined 这下苦恼了,定位不到问题所在. 今天解决了这个问题,就来分享一下. 问题的关键所在是在执行了play()方法以后立 ...

  9. 在命令行到处MYSQL数据到EXCEL表

    有时候需要将 MySQL 的数据导出成 excel,这很简单,无需第三方工具,直接 MySQL 命令行就自带了这样的功能.比如: 1 SELECT * FROM nowamagic into outf ...

  10. 字符串s中从第i个位置起取长度为len的子串,函数返回子串链表

    /*已知字符串采用带结点的链式存储结构(详见linksrting.h文件),请编写函数linkstring substring(linkstring s,int i,int len),在字符串s中从第 ...