并发:用同一个对象多个线程同时操作
1.线程并发非同步
2.线程并发同步
同一个资源多人使用会发生并发问题
处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象,这时候我们就需要”线程同步“。
线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列。
等待前面的线程使用完毕后,下一个线程再使用
线程同步的两个条件:
1.形成队列
2.加入锁机制
3.锁机制
由于同一进程的多个线程共享同一块存储空间,在带来方便的同时也带来了访问冲突的问题。
为了保证数据在方法中被访问时的正确性,在访问时加入了锁机制(synchronized),当一个线程获得对象的排他锁
独占资源,其他线程必须等待,使用后释放锁即可。
注:
1.一个线程持有锁会导致其他所有需要此锁的线程挂起
2.在多线程竞争下,加锁,释放锁会导致比较多的上下文切换和调度延时,引起性能问题
3.如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能问题
4.锁机制锁的是对象是资源
由于我们可以通过private关键字来保证数据对象只能被方法访问,所以我们只需要针对方法提出一套机制,这套机制就是synchronized关键字,
包括两种用法:synchronized方法和synchronized块。
同步方法:public synchronized void metho(int args){}
synchronized方法控制对”成员变量|类变量“对象的访问:每个对象对应一个锁,每个synchronized方法都必须获得调用该方法
的对象的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,
此后被阻塞的线程方能获得该锁,重新进入可执行状态。
注:
若将一个大的方法声明为synchronized将会大大影响效率