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

    1. 本周学习总结

    1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容。

    1.线程间的互斥访问(线程竞争):一些同时运行的线程需要访问共享数据,互斥访问是保证共享资源完整性的手段。实现方式:(1)可以在方法前加上synchronized声明(2)可以在方法中使用synchronized代码块(通过对象锁实现互斥访问)。
    2.线程间的同步访问(线程合作):用wait()和notify()/notifyAll()方法来协调线程间的运行进度关系.wait()方法:执行该方法的线程释放对象的锁,进入wait队列。notify()/notifyAll()方法:唤醒正在等待队列中等待的(一个/所有)线程,并将它(们)移入等待同一个“对象互斥锁”的队列。
    注意:notify()/notifyAll()方法和wait()方法都只能在被声明为synchronized的方法或代码段中调用。
    
    

    2. 书面作业

    本次PTA作业题集多线程

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

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

    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    class Account {
    
    	private Lock poolLock = new ReentrantLock();
    	private int balance;
    
    	public Account(int balance) {
    		super();
    		this.balance = balance;
    	}
    
    	public int getBalance() {
    		return balance;
    	}
    
    	public void deposit(int money) {
    		poolLock.lock();
    		balance += money;
    		poolLock.unlock();
    
    	}
    
    	public void withdraw(int money) {
    		poolLock.unlock();
    		try {
    			while (balance < money) {
    				try {
    					wait();
    				} catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    
    			}
    			balance -= money;
    
    			if (balance < 0) {
    				throw new IllegalStateException(balance + "");
    			}
    		} finally {
    			poolLock.unlock();
    		}
    
    	}
    }
    
    

    使用同步代码块

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

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

    答:同步方法锁定了整个方法,而同步代码块只锁定方法中的会发生竞争状况的区块,这样子在执行被锁定的区块后,线程就释放锁定,其他的线程就可以去竞争对象锁定,相比于同步方法,同步代码块的效率会更高。
    

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

    原理:每个对象都只有一把锁,在任何时刻,最多只允许一个线程拥有这把锁。当一个线程试图执行某个代码块时,如果这把锁没有被其他线程占用,那么该线程就会获得这把锁,如果这把锁已经被其他线程占用,那么该线程就会进入阻塞状态,等待其他线程释放了锁,该线程有机会去竞争该锁。
    

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

    答:synchronized关键字。将同步访问放到synchronized方法或者代码块中,那么多个线程同时访问同一个共享资源时,可以保证共享资源的一致性。
    

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

    答:Repo类中完成任务的方法前要加synchronized,在实现两个线程交替执行时会用到wait()及notify()方法。
    

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

    3.2 进一步使用执行器改进相应代码(关键代码截图,需出现学号)
    参考资料:Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask

    Q4.线程间的合作:生产者消费者问题
    4.1 运行MyProducerConsumerTest.java。正常运行结果应该是仓库还剩0个货物。多运行几次,观察结果,并回答:结果正常吗?哪里不正常?为什么?

    答:不正常。运行结果中有出现仓库还剩余10个货物的情况。因为生产者消费者不同步,当生产者比消费者快时,消费者来不及取货物,当消费者比生产者快时,消费者可能取不到货物。
    

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

    4.3 选做:使用Lock与Condition对象解决该问题。

    Q5.查询资料回答:什么是线程安全?(用自己的话与代码总结,写自己看的懂的作业)
    百度百科的解释:线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。

    class Counter {
    	private static int id = 0;
    
    	public synchronized static void addId() {
    		id++;
    	}
    }
    
    答:我们在addId()方法前加上synchronized关键字,保证了在任意一个时刻,只有一个线程访问该方法。这就是一个线程安全问题。线程安全就是确保一个对象可以同时被多个线程安全地访问,它的实现其实还是用到了对象锁。
    

    3. 码云上代码提交记录

    题目集:多线程(4-4到4-10)

    3.1. 码云代码提交记录

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

    3.2 截图多线程PTA提交列表

  • 相关阅读:
    重新想象 Windows 8 Store Apps (46)
    重新想象 Windows 8 Store Apps (45)
    重新想象 Windows 8 Store Apps (44)
    重新想象 Windows 8 Store Apps (43)
    重新想象 Windows 8 Store Apps (42)
    重新想象 Windows 8 Store Apps (41)
    重新想象 Windows 8 Store Apps (40)
    重新想象 Windows 8 Store Apps (39)
    重新想象 Windows 8 Store Apps (38)
    重新想象 Windows 8 Store Apps (37)
  • 原文地址:https://www.cnblogs.com/kzq-java-markdown/p/6811325.html
Copyright © 2011-2022 走看看