synchronized一半同步一半非同步(菜鳥玩執行緒)
synchronized一半同步一半非同步
論證
不在synchronized塊中就是非同步執行,在synchronized塊中就是同步執行。
示例
自定義共享類
package com.chapter02.thread4;
public class Task {
public void doLongTimeTask() {
for (int i = 0; i < 100; i++) {
System.out.println("NO SYNCHRONIZED THREAD NAME = " + Thread.currentThread().getName () + " i = " + (i + 1));
}
System.out.println("************************************************************************");
synchronized (this) {
for (int i = 0; i < 100; i++) {
System.out.println("SYNCHRONIZED THREAD NAME = " + Thread.currentThread( ).getName() + " i = " + (i + 1));
}
}
}
}
自定義執行緒1
package com.chapter02.thread4;
public class MyThread1 extends Thread {
private Task task;
public MyThread1(Task task) {
this.task = task;
}
@Override
public void run() {
super.run();
task. doLongTimeTask();
}
}
自定義執行緒2
package com.chapter02.thread4;
public class MyThread2 extends Thread {
private Task task;
public MyThread2(Task task) {
this.task = task;
}
@Override
public void run() {
super.run();
task.doLongTimeTask();
}
}
啟動類
package com.chapter02.thread4;
public class Run {
public static void main(String[] args) {
Task task = new Task();
MyThread1 myThread1 = new MyThread1(task);
myThread1.start();
MyThread2 myThread2 = new MyThread2(task);
myThread2.start();
}
}
執行結果
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 1
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 2
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 3
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 4
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 5
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 6
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 7
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 8
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 9
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 10
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 11
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 12
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 13
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 14
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 15
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 16
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 17
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 18
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 19
NO SYNCHRONIZED THREAD NAME = Thread-0 i = 20
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 1
************************************************************************************************
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 2
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 3
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 4
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 5
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 6
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 7
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 8
SYNCHRONIZED THREAD NAME = Thread-0 i = 1
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 9
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 10
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 11
SYNCHRONIZED THREAD NAME = Thread-0 i = 2
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 12
SYNCHRONIZED THREAD NAME = Thread-0 i = 3
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 13
SYNCHRONIZED THREAD NAME = Thread-0 i = 4
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 14
SYNCHRONIZED THREAD NAME = Thread-0 i = 5
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 15
SYNCHRONIZED THREAD NAME = Thread-0 i = 6
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 16
SYNCHRONIZED THREAD NAME = Thread-0 i = 7
SYNCHRONIZED THREAD NAME = Thread-0 i = 8
SYNCHRONIZED THREAD NAME = Thread-0 i = 9
SYNCHRONIZED THREAD NAME = Thread-0 i = 10
SYNCHRONIZED THREAD NAME = Thread-0 i = 11
SYNCHRONIZED THREAD NAME = Thread-0 i = 12
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 17
SYNCHRONIZED THREAD NAME = Thread-0 i = 13
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 18
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 19
NO SYNCHRONIZED THREAD NAME = Thread-1 i = 20
************************************************************************************************
SYNCHRONIZED THREAD NAME = Thread-0 i = 14
SYNCHRONIZED THREAD NAME = Thread-0 i = 15
SYNCHRONIZED THREAD NAME = Thread-0 i = 16
SYNCHRONIZED THREAD NAME = Thread-0 i = 17
SYNCHRONIZED THREAD NAME = Thread-0 i = 18
SYNCHRONIZED THREAD NAME = Thread-0 i = 19
SYNCHRONIZED THREAD NAME = Thread-0 i = 20
SYNCHRONIZED THREAD NAME = Thread-1 i = 1
SYNCHRONIZED THREAD NAME = Thread-1 i = 2
SYNCHRONIZED THREAD NAME = Thread-1 i = 3
SYNCHRONIZED THREAD NAME = Thread-1 i = 4
SYNCHRONIZED THREAD NAME = Thread-1 i = 5
SYNCHRONIZED THREAD NAME = Thread-1 i = 6
SYNCHRONIZED THREAD NAME = Thread-1 i = 7
SYNCHRONIZED THREAD NAME = Thread-1 i = 8
SYNCHRONIZED THREAD NAME = Thread-1 i = 9
SYNCHRONIZED THREAD NAME = Thread-1 i = 10
SYNCHRONIZED THREAD NAME = Thread-1 i = 11
SYNCHRONIZED THREAD NAME = Thread-1 i = 12
SYNCHRONIZED THREAD NAME = Thread-1 i = 13
SYNCHRONIZED THREAD NAME = Thread-1 i = 14
SYNCHRONIZED THREAD NAME = Thread-1 i = 15
SYNCHRONIZED THREAD NAME = Thread-1 i = 16
SYNCHRONIZED THREAD NAME = Thread-1 i = 17
SYNCHRONIZED THREAD NAME = Thread-1 i = 18
SYNCHRONIZED THREAD NAME = Thread-1 i = 19
SYNCHRONIZED THREAD NAME = Thread-1 i = 20
結論
如下所示,在進入synchronized程式碼塊後則排隊執行。
相關推薦
synchronized一半同步一半非同步(菜鳥玩執行緒)
synchronized一半同步一半非同步 論證 不在synchronized塊中就是非同步執行,在synchronized塊中就是同步執行。 示例 自定義共享類 package com.chapter02.thread4; public class Task
synchronized驗證3個理論(菜鳥玩執行緒)
synchronized驗證3個理論 1.論證1 1.1理論 當多個執行緒同時執行synchronized(非this)同步程式碼塊時呈同步效果。 1.2落地 1.2.1自定義鎖物件類 package com.chapter02.thread2_2_8_1; p
synchronized同步方法(菜鳥玩執行緒)
synchronized同步方法 方法內的變數是執行緒安全的 實驗1: 共享變數類 package com.chapter02.thread1; public class HasSelfPrivate
synchronized資料型別String的常量池特性(菜鳥玩執行緒)
synchronized資料型別String的常量池特性 在JVM虛擬機器中有String常量池快取的功能,將synchronized(String)同步塊與String聯合起來使用時,注意常量池帶來的
暫停執行緒(菜鳥玩執行緒)
暫停執行緒 暫停執行緒,即執行緒還可以恢復執行。 Java多執行緒中,可以使用suspend()方法停止執行緒,使用resume()方法恢復執行緒的執行。 suspend與resume方法的使用 直接上
執行緒優先順序(菜鳥玩執行緒)
執行緒的優先順序 在作業系統中,執行緒可以劃分為優先順序,優先順序較高的執行緒得到的CPU資源較多,也就是CPU優先執行優先順序較高的執行緒物件中的任務。 設定執行緒的優先順序使用setPriority
鎖物件的改變(菜鳥玩執行緒)
鎖物件的改變 理論 在將任何資料型別作為同步鎖時,需注意的是,是否有多個執行緒同時持有鎖物件,如果同時持有相同的鎖物件,則這些執行緒之間就是同步的; 如果分別獲得鎖物件,這些執行緒之間就是非同步的。 示
髒讀(菜鳥玩執行緒)
髒讀 髒讀一定會出現在操作例項變數的情況下,這就是不同執行緒”爭搶“例項變數的結果。 髒讀示例 定義共享變數例項類 package com.chapter02.dirtyRead; public cl
C語言經典例題(菜鳥教程100例)
這兩天正在看基礎的演算法,在做的時候肯定不能避免的接觸了菜鳥上的經典100例,但是使用的時候發現並不是那麼的方便,因為它只是給了序號,如果查詢某一問題的話很不方便,所以做了這篇部落格,希望給自己和其他人帶來幫助!
Java多執行緒菜鳥入門&執行緒安全
什麼是程序 電腦中時會有很多單獨執行的程式,每個程式有一個獨立的程序,而程序之間是相互獨立存在的。比如下圖中的QQ、酷狗播放器、電腦管家等等。 什麼是執行緒 程序想要執行任務就需要依賴執行緒。換句話說,就是程序中的最小執行單位就是執行緒,並且一個程序中至少有一個
關於執行緒同步的問題(區域性變數實現執行緒同步)
package com.bootdo.wang; /** * 5.使用區域性變數實現執行緒同步 * 如果使用ThreadLocal管理變數,則每一個使用該變數的執行緒都獲得該變數的副本, * 副本之間相互獨立,這樣每一個執行緒都可以隨意修改自己的變數副本,而不會對其他執行緒產生
關於執行緒同步的問題(原子變數實現執行緒同步)
package com.bootdo.wang; import java.util.concurrent.atomic.AtomicInteger; /** * 7.使用原子變數實現執行緒同步 * 在java的util.concurrent.atomic包中提供了建立了原子型別變數的工
群聊實現(tcp和多執行緒)
服務端程式碼 package com.cyj.tcp.chat2; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import ja
ucontext實現的使用者級多執行緒框架2(搶先式多執行緒)
#include "uthread.h"#include <assert.h>#include <stdlib.h>#include <time.h>ucontext_t Scheduler::ucontext;char Scheduler::stack[4096];u
多執行緒(至少三個執行緒)分別列印A、B、C,要求按ABC的順序迴圈列印10次。
看到網上一道題,三個執行緒按順序列印A、B、C迴圈10次,於是自己按幾種方法也寫了一下: 一、用執行緒池、Lock鎖和condition(Object 監視器方法的使用)組合使用實現: package multithread; import java.util.concu
《Efficient Android Threading》Chapter 3---Threads on Android (Android中的執行緒)
Android中的執行緒 序: 閱讀英文原版,受益匪淺。修飾詞形容惟妙惟肖。 其中舉例之圖,經典,且秒不可言。亦當細細品味之。 翻譯為谷歌翻譯。 重點單詞日後補上,可用有道詞典積累,認識的單詞會越來越多
Android連線伺服器,從伺服器獲取資料,以及從伺服器下載檔案(單,多執行緒)
首先需要在Eclipse中建立一個伺服器,在其中存入要下載的檔案,具體可參考之前的伺服器篇。 ScollView可以上下滑動 另外還有,android中的網路連線與之前java中可以通用,可以參照之前伺服器客戶端通訊篇。 新增的許可權
一半同步-一半非同步
package com.freeflying.thread.sync; /** * 一半同步,一半非同步 * @ClassName: SyncAndAsync * @Description: * @author freeflying * @date 2018年7
Ubuntu分區方案(菜鳥方案、常用方案和進階方案)
變化 格式化 執行 菜鳥 格式 分開 清理 知識庫 重新 菜鳥方案 “/”與swap兩個分區就可以應付絕大多數的應用 常用方案 分為3個區 1. 掛載點/;主分區;安裝系統和軟件;大小為30G;分區格式為ext4; 2. 掛載點/home;邏輯分區;相當於“我的文檔”;大小
java語言登陸界面(菜鳥版)
pub oid box nts ring 實現 visible logs 更換 最近在看的Java入門書是《Head First》,一本很棒的Java書。 老師要求的程序流程圖我沒有,之前我們的做法是寫完代碼再畫流程圖,我想這樣的做法是不對的,流程圖應該是在寫代碼之前設計思