1.cpu线程数,不代表,java多线程,java的多线程由 jvm分配,jvm线程的设计不等于 CPU线程,jvm线程 > cpu线程
2.java的多线程,可以由 jvm分配,tomcat也有自己的线程池(不采用默认的 jvm线程池),tomcat就是 一个 jar包,它的线程分配,不采用 jvm线程池分配
3.java多线程的重点
1.分析,现在的 线程数
2.分析,线程中的 栈帧中 有没有共享资源
怎么分析共享资源
1.在这个线程 创建的 共享资源
2.这个线程创建前,就有了的共享资源,只是在这个线程调用了
但是这种情况,那个共享资源,显然也是 之前某个线程 创建的 共享资源
而通常,我们如果手动创建线程,一般情况下,只能用api去,调用 这个线程创建前,就已经有的 共享资源,例如 new Thread(Runnable),这个runnable就是在 本线程创建的共享资源,然后我们在本线程创建几个线程,将runnable传过去,创建的线程 调用 runnable的run方法,这样,这几个线程就在使用,那个 “”“本线程”创建的共享资源,即在这几个线程创建之前就有的共享资源,这样就涉及 线程安全问题了
说白了:为什么说 在这个线程 创建的 共享 资源不能给,其他线程用,重点就是 我们api 可能无法 做到,线程可以调用这个共享资源,只要api可以做到,就行,现在还不是特别清楚,以后再说
总之,只要你分析出,共享资源,并且分析出,这个共享资源,在写的代码中,能够被多个线程执行,那么就可能涉及线程安全问题
但是以现在的知识,我们手动创建线程,即Thread api创建,我能够做到的,我创建共享资源,能够,这几个创建的线程用的,就是通过 new Thread(Runnable , treadName) 这个api , 我们在 主线程中 创建一个runnable接口实现类,这个是共享资源(堆中的),重点是,我们可以将这个runnable传给 thread() , 然后调用 start方法,这样 这多个创建的线程都执行的是 runnable实现类的 run方法,即这多个 线程,都在执行共享资源
同样,tomcat请求过来,也是多个线程 执行 servlet的方法(是共享资源),有可能也涉及线程安全问题的,同样我们自己 手动创建的线程(目的是为了业务逻辑,去并发执行某段业务),也是可能涉及线程安全问题的,但是现在我 可能还无法 确定,哪些情况线程安全我必须控制,但是一点,起码要能分析出,这段代码 是否存在线程安全(1.知道这段代码能否被多个线程执行,2.多个线程都能执行这段代码,那这段代码是否是本身就是 共享资源例如对象的实例方法,或者这个线程中是否执行了 共享资源),然后在去考虑 是否要 同步它