這里主要涉及到類對象(static方法),對象方法(非static方法)
我們知道,當synchronized修飾一個static方法時,多線程下,獲取的是類鎖(即Class本身,注意:不是實例);
當synchronized修飾一個非static方法時,多線程下,獲取的是對象鎖(即類的實例對象)
所以,當synchronized修飾一個static方法時,創建線程不管是new JoinThread()還是new Thread(new JoinThread()),在run方法中執行inc()方法都是同步的;
相反,當synchronized修飾一個非static方法時,如果用new JoinThread()還是new Thread(new JoinThread())方式創建線程,就無法保證同步操作,因為這時
inc()是屬於對象方法,每個線程都執有一個獨立的對象實例new JoinThread(),所以多線程下執行inc()方法並不會產生互斥,也不會有同步操作。
另外如果考慮到變更的原子操作,可使用atomic包下面的包裝對象,這些對象都是對volatile修飾變量的一種延伸,可保證變量的原子操作而不用去同步方法或
代碼塊是否同步。