finalDemo

package com.fh.interview;

import org.junit.Test;

/**
 * @author
 * @create 2018-05-28 下午10:09
 **/
//类不能被继承
public final class FinalDemo {

    //不能被修改
    public final String message = "111";

    //不能被重写
    public final void test(){

    }

    //在定义的时候赋值
    //或者在静态代码中
    public static final String test = "12";
    public static final String aaa;
    static {
        aaa="121";
    }

    //类变量赋值时机
    public final String test1="12";
    public final String test2;
    {
        test2="12";
    }
    public final String test3;
    public FinalDemo(){
        test3="123";
    }

    public void test4(final String a){
        final String b;
        b="12";
//        b="12";
    }

    /**
     * 当final修饰基本数据类型变量时,不能对基本数据类型变量重新赋值,
     * 因此基本数据类型变量不能被改变。而对于引用类型变量而言,
     * 它仅仅保存的是一个引用,
     * final只保证这个引用类型变量所引用的地址不会发生改变,即一直引用这个对象,
     * 但这个对象属性是可以改变的。
     */
    @Test
    public  void test123(){
        final Person person = new Person("12","123");
        person.setAge("234");
        System.out.println(person.getAge());
    }

    static class Person{
        private  String age;
        private  String name;

        public Person(String age,String name){
            this.age=age;
            this.name=name;
        }

        public String getAge() {
            return age;
        }

        public void setAge(String age) {
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }


    /**
     *  父类的final方法是不能够被子类重写的

        final方法是可以被重载的
     */
    public final void test345(){

    }

    public final void test345(String aaa){

    }

    //JDK中提供的8个包装类都是不可变的
    //String 也是不可变的

    //在对象引用为任意线程可见之前,
    // 对象的final域已经被正确初始化过了,而普通域就不具有这个保障
    //普通变量的重排序不能到构造函数之外

    //在读一个对象的final域之前,一定会先读这个包含这个final域的对象的引用。



    //按照final修饰的数据类型分类:

   // 基本数据类型:

    //final域写:禁止final域写与构造方法重排序,即禁止final域写重排序到构造方法之外,从而保证该对象对所有线程可见时,该对象的final域全部已经初始化过。
    //final域读:禁止初次读对象的引用与读该对象包含的final域的重排序。
   // 引用数据类型:

    //额外增加约束:禁止在构造函数对一个final修饰的对象的成员域的写入与随后将这个被构造的对象的引用赋值给引用变量 重排序
}
View Code

 

转载于:https://www.cnblogs.com/nihaofenghao/p/9102747.html

在下面这段代码中,哪些内容实现了同步读写:// 读写函数 static ssize_t finaldemo_read(struct file *filp,char *buf,size_t len,loff_t *off) { if(wait_event_interruptible(finaldemo.outq,finaldemo.flag!=0)) //不可读时 阻塞读进程 { return -ERESTARTSYS; } if(down_interruptible(&finaldemo.sem)) //P 操作 { return -ERESTARTSYS; } finaldemo.flag = 0; printk("into the read function\n"); printk("the rd is %c\n",finaldemo.rd); //读指针 if(finaldemo.rd < finaldemo.wr) len = min(len,(size_t)(finaldemo.wr - finaldemo.rd)); //更新读写长度 else len = min(len,(size_t)(finaldemo.end - finaldemo.rd)); printk("the len is %d\n",len); if(raw_copy_to_user(buf,finaldemo.rd,len)) { printk(KERN_ALERT"copy failed\n"); / up递增信号量的值,并唤醒所有正在等待信号量转为可用状态的进程。 必须小心使用信号量。被信号量保护的数据必须是定义清晰的,并且存取这些数据的所有代码都必须首先获得信号量。 */ up(&finaldemo.sem); return -EFAULT; } printk("the read buffer is %s\n",finaldemo.buffer); finaldemo.rd = finaldemo.rd + len; if(finaldemo.rd == finaldemo.end) finaldemo.rd = finaldemo.buffer; //字符缓冲区循环 up(&finaldemo.sem); //V 操作 return len; } static ssize_t finaldemo_write(struct file *filp,const char *buf,size_t len,loff_t *off) { if(down_interruptible(&finaldemo.sem)) //P 操作 { return -ERESTARTSYS; } while(spacefree(&finaldemo) == 0) //检查剩余空间 { up(&finaldemo.sem); //释放信号量 if(filp->f_flags & O_NONBLOCK) return -EAGAIN; if(wait_event_interruptible(finaldemo.inq,(spacefree(&finaldemo) > 0))) return -ERESTARTSYS; if(down_interruptible(&finaldemo.sem)) return -ERESTARTSYS; } if(finaldemo.rd <= finaldemo.wr) len = min(len,(size_t)(finaldemo.end - finaldemo.wr)); else len = min(len,(size_t)(finaldemo.rd-finaldemo.wr-1)); printk("the write len is %d\n",len); if(raw_copy_from_user(finaldemo.wr,buf,len)) { up(&finaldemo.sem); //V 操作 return -EFAULT; } printk("the write buffer is %s\n",finaldemo.buffer); printk("the len of buffer is %d\n",strlen(finaldemo.buffer)); finaldemo.wr = finaldemo.wr + len; if(finaldemo.wr == finaldemo.end) finaldemo.wr = finaldemo.buffer; //循环 up(&finaldemo.sem); //V 操作 finaldemo.flag=1; //条件成立,可以唤醒读进程 wake_up_interruptible(&finaldemo.outq); //唤醒读进程 return len; } module_init(finaldemo_init); module_exit(finaldemo_exit); MODULE_LICENSE("GPL");
06-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值