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

    1. 本周学习总结

    2. 书面作业

    Q1.互斥访问与同步访问
    完成题集4-4(互斥访问)与4-5(同步访问)
    1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步访问(请出现相关代码)?
    1.2 同步代码块与同步方法有何区别?
    1.3 实现互斥访问的原理是什么?请使用对象锁概念并结合相应的代码块进行说明。当程序执行synchronized同步代码块或者同步方法时,线程的状态是怎么变化的?
    1.4 Java多线程中使用什么关键字实现线程之间的通信,进而实现线程的协同工作?为什么同步访问一般都要放到synchronized方法或者代码块中?

    1.1 可以使用Lock对象和Condition对象实现互斥同步访问

           public synchronized void deposit(int money){
    		lock.lock();
    		try{
    			this.balance=this.getBalance()+money;//存钱
    		}finally{
    			lock.unlock();//可以保证发生异常 锁可以得到释放 避免死锁的发生  
    		}
    	}
    	
    	public void withdraw(int money){
    		lock.lock();
    		try{
    			try{
    				while(this.getBalance()<=0)
    				condition.await();
    				condition.signal();
    			}catch(Exception e){
    				System.out.println(e);
    			}
    			this.balance=this.getBalance()-money;
    				if(balance<0) 
    			        throw new IllegalStateException(balance+"");
    		}finally{
    			lock.unlock();//可以保证发生异常 锁可以得到释放 避免死锁的发生  
    		}
    	}
    

    1.2 主要是格式上的不同,同步代码块主要是在方法中使用synchronized关键字实现互斥public void 方法名{ synchronized(类对象名T) {//同步代码块} };同步方法是在定义方法时,加在void前,public synchronized void 方法名{//同步代码块}

    1.3 原理是在对象持有对象锁才可以进行线程,其余线程无对象锁而待在Lock Pool中,等待该线程结束后,其他线程竞争对象锁后再运行线程,一个线程正在操作某资源的时候,将不允许其他线程操作该资源,即一次只允许一个线程处理该资源,例public static synchronized void addId() {id++;},若有多个线程执行该方法,此时这多个线程竞争获得对象锁,每次竞争只有一个对象获得对象锁,假设线程t获得对象锁,此时t线程执行id++,而其他线程在Lock Pool中等待直到t线程结束,再竞争对象锁,直到所有线程运行完毕;状态:多个线程运行->多个线程竞争对象锁->一个线程获得对象锁运行,其余等待->一个线程结束,其余线程竞争对象锁->直到所有线程运行结束

    1.4 wait()和notify()/nofityAll()来实现线程之间的通信;存在多个线程同时运行时,没有互斥,将会使线程运行混乱,例如存钱与取钱,可能有多个人要进行,若是synchronized关键字,存钱时与取钱时,可能会造成A存钱时,B存钱也同时进行,而C取钱,余额在A,B,C的操作下同时进行,数值将会错误

    Q2.交替执行
    实验总结(不管有没有做出来)

    • 实验总结:先是建立Repo类,存储字符串items.split(" ");;Worker1和Worker2类继承Runnable接口,若是要两个线程交替运行,需要使用wait()notify()函数,需要在run函数加入synchronized关键字,run函数中循环while(),循环条件是this.repo.getSize()!=0,输出字符串数组,并将null该字符串数组,达到将任务删除,通过判断数组下标的奇偶数来决定接下来需要运行的线程,若是偶数,则运行Worker1,Worker2则wait();若是奇数则运行Worker2,Worker1则wait();以此来交替线程运行;题目的难点在于怎么样设计这个两个线程的交替实现,由于线程争用cpu的随机性,就需要Worker1和Worker2线程执行,在Worker1执行完一次进入等待之前唤醒Worker2,如此往复,主要要用上wait()和notify()了。

    Q3.互斥访问
    3.1 修改TestUnSynchronizedThread.java源代码使其可以同步访问。(关键代码截图,需出现学号)
    3.2 进一步使用执行器改进相应代码(关键代码截图,需出现学号)

    3.1 关键代码截图

    3.2 关键代码截图

    • 上网搜索invokeAll方法,在代码中,两次for循环的次数要相等,若是不等,则会导致最后结果是相差次数的输出次数,例第一个循环4次,第二个2次,输出是20000,若总线程数是奇数,还是用其它的执行器

    Q4.线程间的合作:生产者消费者问题
    4.1 运行MyProducerConsumerTest.java。正常运行结果应该是仓库还剩0个货物。多运行几次,观察结果,并回答:结果正常吗?哪里不正常?为什么?
    4.2 使用synchronized, wait, notify解决该问题(关键代码截图,需出现学号)
    4.3 选做:使用Lock与Condition对象解决该问题。

    4.1 运行多次代码,发现并不是每次的运行结果是仓库还剩0个货物,结果不正常,在public synchronized void add(String t)public synchronized void remove()的方法体中应该有wait()和notify()函数来实现线程之间的合作,否则多个线程只是不互斥,却没有合作,导致结果出错

    4.2 关键代码截图

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

    • 代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的,也就是线程同步
      例如
    public synchronized static void addId() {
        id++;
    }
    
    public synchronized static void subtractId() {
        id--;
    }
    

    多个线程同时运行以上代码,synchronized关键字使得线程同步,多个线程运行结果和单个线程运行结果一致,都为0,

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

    3.1. 码云代码提交记录

    • 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

    3.2 截图多线程PTA提交列表

  • 相关阅读:
    使用 ASP.NET Core MVC 创建 Web API(五)
    使用 ASP.NET Core MVC 创建 Web API(四)
    使用 ASP.NET Core MVC 创建 Web API(三)
    使用 ASP.NET Core MVC 创建 Web API(二)
    使用 ASP.NET Core MVC 创建 Web API(一)
    学习ASP.NET Core Razor 编程系列十九——分页
    学习ASP.NET Core Razor 编程系列十八——并发解决方案
    一个屌丝程序猿的人生(九十八)
    一个屌丝程序猿的人生(九十七)
    一个屌丝程序猿的人生(九十五)
  • 原文地址:https://www.cnblogs.com/gemola/p/6809417.html
Copyright © 2011-2022 走看看