1.多线程的常用方法
wait(), notify(), notifyAll(), 方法都必须在同步代码中,而Thread.sleep()不需要。wait方法,notify方法,notifyAll方法都需要由具体的所对象去调用,才会进入具体对象的wait set 或者 唤醒 对应对象的wait set里面的线程!
2.多个同步代码块使用同一个所对象,多个线程,在一个时间点,只能进入一个同步代码块。
3. 死锁产生的情况
有两种,1,是互相持有锁对象,互相等待;2,多个线程都在wait,都没有持有锁对象,没有线程来唤醒,导致一直wait
4. 锁的出现,必然是为了保护某个对象或者属性
5. single thread execution pattern:
一次只能有一个线程执行
6. immutable pattern:
不会有线程安全问题的对象设计;一般这种对象都是一次性的
7. gurded suspension pattern:
这种pattern包含,guarded object(被守护的对象),guarded method(被守护只能一个线程执行的方法),以及state change method(改变状态的方法,同样也只能一次一个线程执行);比较经典的案例就是阻塞队列,队列里没有新的元素,get方法就会一直阻塞;
8.balking pattern:
劝退模式,如果一个人已经介入了,其他人直接劝退;和guarded suspension pattern很类似,但是最大的不同就是,这里不会阻塞,其他线程该干嘛干嘛;
9 producer consumer pattern:
生产者消费者模式,生产者和消费者通过队列进行解耦,队列类,会有put方法和get方法,这两个方法都必须是同步方法;
10 read write locker:
读写锁,锁对象,通过readlock方法,readlockRelease方法,writelock方法,writelockRelease方法修改自身属性(正在读的线程数量,正在写的线程数量),同时通过guarded suspension pattern 判断条件是否满足,如果不满足就wait(),来实现操作的互斥;
11 Java内存模型:
Java的内存模型可以当做,工作内存,和主存。工作内存的变量是从主存中拷贝出来的,工作内存的变量被修改后,会在某一时刻被同步到主存中。正常情况下两个方向的同步时间都是不确定的。这就造成了,变量值不同步的问题。在某些需要变量具有实时性的场景中,可以使用synchronize,和violate来保证全局变量的可见性;