zoukankan      html  css  js  c++  java
  • 201521123055 《Java程序设计》第11周学习总结

    1. 本章学习总结

    2. 书面作业

    Q1.互斥访问与同步访问

    ** 完成题集4-4(互斥访问)与4-5(同步访问) **

    1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步访问(请出现相关代码)?

    1.2 同步代码块与同步方法有何区别?

    1.3 实现互斥访问的原理是什么?请使用对象锁概念并结合相应的代码块进行说明。当程序执行synchronized同步代码块或者同步方法时,线程的状态是怎么变化的?

    1.4 Java多线程中使用什么关键字实现线程之间的通信,进而实现线程的协同工作?为什么同步访问一般都要放到synchronized方法或者代码块中?

    1.1 在Java1.5之后,可使用java.util.concurrent.locks包提供的操作方法替代synchronized机制。

    测试代码:

    public class Main {
        static Lock lock=new ReentrantLock();
        public static void main(String[] args) {
    
            lock.lock();    //若锁处于空闲状态,则获得锁;若其他进程获得锁,则禁用当前进程
    
        }
    
        public static invoke()
        {
            lock.unlock();   //释放锁
        }
    }
    

    Lock的出现其实是同步机制的升级版,由于运行到synchronized修饰的代码块之外时,进程便自动解除block状态,因此通过Lock的使用使用户可以更自由控制锁的使用。

    1.2

    当一个进程获得了某个object的锁时,其他进程将无法访问该obj内的同步代码块,但可以访问非同步代码块。而同步方法则是限制了进程对于obj的访问。

    1.3

    为了实现互斥访问,在编程中引入了互斥锁的概念,每个对象都有一个互斥锁的标记,来保证在同一时刻只能有一个进程访问该对象。

    测试代码:

    class Account{
        private int balance;
    
        public Account(int balance) {
            this.balance = balance;
        }
    
        synchronized void deposit(int money)
        {
            this.balance+=money;
        }
    
        synchronized  void withdraw(int money)
        {
            this.balance-=money;
        }
    
        public int getBalance() {
            return balance;
        }
        
    }
    

    将实现类Account中的俩方法都上锁,就意味着当某个进程调用方法时,若其他进程也调用到该方法,那么便进入block状态,当方法锁释放时重新进入running状态。

    1.4

    使用wait()、notify()可以用来实现线程之间的通信协作。使用synchronized关键字的原因便是防止多个线程同时访问同一对象导致的冲突。

    Q2.交替执行###

    实验总结(不管有没有做出来)

    Q3.互斥访问###

    3.1 修改TestUnSynchronizedThread.java源代码使其可以同步访问。(关键代码截图,需出现学号)

    3.2 进一步使用执行器改进相应代码(关键代码截图,需出现学号)

    参考资料:Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask

    3.1

    //201521123055
    public static synchronized void addId() {
        id++;
    }
    
    public static synchronized void subtractId() {
        id--;
    }
    

    两个函数加上synchronized关键字即可

    3.2

        ExecutorService ec= Executors.newCachedThreadPool();
    
        for(int i=0;i<3;i++)
        {
            ec.execute(new Adder());
        }
        for(int i=0;i<3;i++)
        {
            ec.execute(new Subtracter());
        }
    
        ec.shutdown();
        ec.awaitTermination(1, TimeUnit.DAYS);
    

    关键是调用awaitTermination()来完成join效果。

    Q4.线程间的合作:生产者消费者问题###

    4.1 运行MyProducerConsumerTest.java。正常运行结果应该是仓库还剩0个货物。多运行几次,观察结果,并回答:结果正常吗?哪里不正常?为什么?

    4.2 使用synchronized, wait, notify解决该问题(关键代码截图,需出现学号)

    4.1
    有时候会出现还剩十个货物,因为存取的速度不同导致的。

    4.2

    //201521123055
    public synchronized void add(String t) {
        while (repo.size() == capacity) {
            try{
                wait();
            }catch (Exception e)
            {
               e.printStackTrace();
            }
        }
    
        repo.add(t);
        notifyAll();
    
    }
    public synchronized void remove() {
        while (repo.size() == 0) {
            try{
                wait();
            }catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    
        repo.remove(0);
        notifyAll();
    }
    

    Q5.查询资料回答:什么是线程安全?(用自己的话与代码总结,写自己看的懂的作业)

    线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用

    听起来是有点糊涂,打个比方就是,俩人都要去图书馆借同一本书,A先弄到手,那B去借肯定是借不到的,做到同一时间只有一个线程调用某一资源,就是线程安全。保证线程安全是很重要的,因为多线程中很容易对资源的调用产生问题,这时候做到唯一性是很必要的。

    3. PTA实验总结及码云上代码提交记录

    3.1

    3.2

  • 相关阅读:
    Linux编程 22 shell编程(输出和输入重定向,管道,数学运算命令,退出脚本状态码)
    mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)
    mysql 开发进阶篇系列 45 物理备份与恢复(xtrabackup 安装,用户权限,配置)
    mysql 开发进阶篇系列 44 物理备份与恢复( 热备份xtrabackup 工具介绍)
    Linux编程 21 shell编程(环境变量,用户变量,命令替换)
    Linux编程 20 shell编程(shell脚本创建,echo显示信息)
    mysql 开发进阶篇系列 43 逻辑备份与恢复(mysqldump 的基于时间和位置的不完全恢复)
    Linux编程 19 编辑器(vim 用法)
    (网页)angularjs中的interval定时执行功能(转)
    (网页)在SQL Server中为什么不建议使用Not In子查询(转)
  • 原文地址:https://www.cnblogs.com/wkfg/p/6817870.html
Copyright © 2011-2022 走看看