本帖最后由 曹睿翔 于 2013-5-1 22:29 编辑
毕老师的视频上面关于静态内部类被外部其他类访问是这么说的。
1.在外部其他类中,如何直接访问static内部类的非静态成员呢?
new Outer.Inner().function(); - class Outer
- {
- int x =3;
- static class Inner {
- void function ()
- {
- System.out.println(a);
- }
- }
- }
复制代码 2.在外部其他类中,如何直接访问static 内部类的静态成员呢?
Outer.Inner.function(); - <span style="background-color: rgb(255, 255, 255); color: rgb(102, 102, 102); font-family: Monaco; font-size: 12px; line-height: 25.200000762939453px; ">class Outer</span>{
- int x =3;
- static class Inner{
- static void function (){
复制代码这两个代码的加载过程是不是这样的:
new Outer.Inner().function();
1.因为Outer不是静态,Inner是静态的,需要加载Outer后才能调用Inner
2.调用Inner,创建Outer.Inner()的匿名对象[堆内存中
3.匿名对象调用方法
Outer.Inner.function();
因为Inner.class和它的function()都是静态的,编译的时候就进入了静态区
1.加载Outer类到内存
2.调用Inner类
3.调用function();
问题2:
关于();
对于方法,每次编程都需要带()
对于类,只新建类的对象的时候带();在调用类的时候就不用带()
同步静态方法时会获取该类的“Class”对象,所以当一个线程进入同步的静态方法中时,线程监视器获取类本身的对象锁,其它线程不能进入这个类的任何静态同步方法。它不像实例方法,因为多个线程可以同时访问不同实例同步实例方法。 并发线程中与共享变量有关的程序段称为临界区。学习毕老师的视频后,我们知道java中用关键字synchronized声明一段临界区,只要该为临界区加的是同一把锁就可以实现同步的,这里是我写过的代码,读者和写者问题,经典的同步问题。 - /**
- * 题目:用多线程同步思想实现对某个共享缓冲区的读写操作的设计,即一旦写入数据,马上读走。
- * 线程同步,说白了,强调的是先后次序,也就是说必须等我这边忙完了,你那边才开始。
- * */
- public class ReaderAndWrite {
- public static void main(String[] args) {
-
- Buffer buffer = new Buffer();
- String[] datas = {"张三","李四","王五","赵六"};
- new writer(buffer,datas).start();
- new Reader(buffer,datas).start();
- }
- }
- class Buffer{
- private String data;
- private boolean isNull = true;//读写线程通信的信号量,true表示缓冲区为空,可写
- public void putData(String data){
- while (!isNull) {//等待isNull为true,即等待数据被读走
- try {
- this.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- this.data = data;//此时isNull为true,即前一个数据已被取走
- isNull = false;//将信号量设为false,表示缓冲区不为空,用以通知读进程
- notify();//唤醒等待的读线程,以进行读取刚刚存入的数据
- }
-
- public String getData(){
- while (isNull) {//此时若isNull为true,即无数据,则等待isNull为false,即等待写入数据
-
- try {
- this.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- isNull = true;//将信号量设为true,表示缓冲区为空,用以通知写进程
- notify();//唤醒等待的写线程,以进行写操作
- return data;//有数据则返回当前数据
- }
- }
- class writer extends Thread{
- private Buffer buffer;
- private String[] datas;
- public writer(Buffer buffer,String[] datas) {
- this.buffer = buffer;
- this.datas = datas;
- }
- public void run(){
- //很明显,涉及到缓冲区,则可以将表示缓冲区的共享变量设为锁
- synchronized (buffer) {
- for(int i = 0;i<datas.length;i++){
- buffer.putData(datas[i]);
- System.out.println("写入:"+datas[i]);
- }
- }
- }
- }
- class Reader extends Thread{
- private Buffer buffer;
- private String[] datas;
- public Reader(Buffer buffer,String[] datas) {
- this.buffer = buffer;
- this.datas = datas;
- }
- public void run(){
- //使用与写操作相同的缓冲区,则设置同一把锁
- synchronized (buffer) {
- for(int i = 0;i<datas.length;i++){
- System.out.println("读取:"+buffer.getData());
- }
- }
- }
- }
复制代码 |