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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 王杰123 于 2013-4-5 10:03 编辑

class Ticket implements Runnable //实现 Runnable  接口 目的是构造线程要执行的代码
{
        private static  int tick = 100;//有100张票
        //Object obj = new Object();
        boolean flag = true;//做个标记,让两个线程分别执行下面两个锁。
        public  void run()
        {
                if(flag)
                {
                        while(true)
                        {
                                synchronized(Ticket.class)//给代码块上锁,其他线程必须等到锁被打开才能才能进去
                                {
                                        if(tick>0)
                                        {
                                                try{Thread.sleep(10);}catch(Exception e){}//模拟环境 专门让某个线程进入睡眠状态,目的是让其他线程得到执行权
                                                System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
                                        }
                                }
                        }
                }
                else
                        while(true)
                                show();
        }
        public static synchronized void show()//同步函数加锁
        {
                if(tick>0)
                {
                        try{Thread.sleep(10);}catch(Exception e){}//模拟让某个线程进入睡眠状态,目的是让其他线程得到执行权
                        System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
                }
        }
}


class  StaticMethodDemo
{
        public static void main(String[] args)
        {

                Ticket t = new Ticket();

                Thread t1 = new Thread(t);//创建线程t1
                Thread t2 = new Thread(t);//创建线程t2
                t1.start();//线程启动
                try{Thread.sleep(10);}catch(Exception e){}//让主线程进入睡眠,目的是让其他线程得到执行权
                t.flag = false;
                t2.start();//线程启动


        }
}
/*
如果同步函数被静态修饰后,使用的锁是什么呢?
通过验证,发现不在是this。因为静态方法中也不可以定义this。
静态进内存是,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
类名.class  该对象的类型是Class
静态的同步方法,使用的锁是该方法所在类的字节码文件对象。 类名.class
*/

看到红色这句话,字节码文件对象,以前视频中那块提过??我一点印象都没有。

谁能补充一下,一个类进内存后 分哪些区域,各自区域负责什么,比如一个类 中有 静态变量,实例变量,局部变量,非静态方法,静态方法,构造函数,静态代码块,构造代码块,纷纷都在那个部位放着。如果看到一个类,就能把内存分配图画出来就好了。哈哈 烦劳各位了

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

2 个回复

倒序浏览
静态方法和静态变量都存放在内存的方法区静态部分,包括构造代码块和静态代码块,会跟着类的加载而加载.
非静态方法和构造函数存放在方法区的非静态部分,不会随着类加载,但是会在被调用时进入栈内存中.
堆内存中存放创建的对象.
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中
当类被加载虚拟机会在栈内存中为main函数开辟空间,调用需要的方法进栈.启动线程就是在栈中保存.
个人理解,不对还望指正
回复 使用道具 举报

java类中变量存储
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)
5. 常量池:存放字符串常量和基本类型常量(public static final)。
对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。
局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。成员变量存储在堆中的对象里面,由垃圾回收器负责回收。

可以参考这篇文章:http://blog.sina.com.cn/s/blog_52fea7b60100pi0g.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马