Java多线程与并发库高级应用(传智播客)


--------------------------------- Java多线程与并发库高级应用
------------------------------------------- 1.传统线程机制的回顾
1.多个线程对同一个数据进行操作(加synchronized()),要线程同步,静态方法只有跟字节码关联,类的字节码是万能的,字节码只有一份 1.线程同步的方法
public void output(String name){ int len = name.length(); synchronized
(Outputer.class) { for(int i=0;i queue = new ArrayBlockingQueue(1); //信号灯 final
Semaphore semaphore = new Semaphore(1); final SynchronousQueue queue = new
SynchronousQueue(); //操作集合的存取时,用CopyOnWriteArrayList,可以获取condition,lock private
CopyOnWriteArrayList keys = new CopyOnWriteArrayList(); 1.
总之,要同步互斥的几段代码最好是分别放在几个独立的方法中,这些方法再放在同一个类中,这样比较容易实现它们之间的同步互斥和通信 *
面试题需求:设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序 * 根据题目要求,很明显要用到线程同步(synchronized)
* 用到的知识点,同步synchronized()方法, 外部类调用内部类的方法 * ThreadTest1 tt=new ThreadTest1(); Inc
inc= tt.new Inc(); * Thread t=new Thread(inc); //传一个runnable对象inc 进去
1.内部类特点:1.内部类中不允许定义静态变量2.在内部类中访问外部类中与内部类同名的实例变量用外部类名.this.变量名
3.如果内部类中没有与外部类同名的变量,则可以直接用变量名访问外部类变量 4.可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的
condition 阻塞队列 队列:先进先出 blockingQueueTest.java 阻塞队列 成员变量只有创建类的实例才赋值
静态代码块只有在类加载的时候执行,只会执行一次 匿名构造方法有几个构造方法就调用几次 死锁:都堵住了,方法不能执行 内部类可以访问外部类的对象
线程互斥一定是同一个对象 外部类怎样调用类部类的方法 AtomicInteger 任何线程死了,怎样再启动
多态::“一个接口,多种实现”,就是同一种事物表现出的多种形态。 ReadWriteLock ReentrantReadWriteLock Condition
线程的同步,安全,什么时候用线程异步 同步的数据是安全的还是不安全的 concurrent ExecutorService 线程池
数组就是连续的一段内存,列表不是一段连续的内存 如果线程被多个应用访问,用ConcurrentHashMap 要实现同步(synhronized)
接受的对象(监视器对象必须是同一个,即传入的对象(this)) 同步即互斥,进了这里,就不能进那里 Clooections
--->synchronizedMap --->map 的线程同步 Collections.synchronizedMap(null) HashSet
与HashMap 有什么联系 HashSet 内部使用的是hashMap实现 只是用hashMap key,没有value 使用new Runnable
更面向对象 Runnable 表示一个对象,Runnable表示代表任务的那个对象 Test 同步队列 编译器把代码翻译成字节码 编译器优化 String a
=new String("a"); a与b不是同一个对象 String b=new String("a"); a="1"+""; b="1"+"";
a与b是同一个对象 只有满足synchronize(this) 这个this代表的对象是同一个是才互斥,否则不互斥 也就是不是线程同步
迭代的过程中不能对集合进行操作 用CopyOnWriterArrayList可以解决迭代过程中不能对集合进行 操作的问题
java5线程并发库里面的CopyOnWriterArrayList

猜你喜欢

转载自lvwenwen.iteye.com/blog/1560017