java 并发测试main方法_java并发编程test之synchronized测试
synchronized關(guān)鍵字可以用于聲明方法,也可以用于聲明代碼塊;
package com.test.java;
public class SyncTest {
public static void main(String[] args) {
SynchronizedDemo1 synct1 = new SynchronizedDemo1();
SynchronizedDemo2 synct = new SynchronizedDemo2();
SynchronizedDemo2 synct2 = new SynchronizedDemo2();
Thread t = new Thread(){
@Override
public void run() {
SynchronizedDemo1.foo1();
}
};
Thread t2 = new Thread(){
@Override
public void run() {
synct1.foo2();
}
};
t.start();
t2.start();
System.out.println("-------------");
}
}
/**
* 靜態(tài)方法修飾, 全局阻塞(調(diào)用方法則阻塞)
* 在不同線程中,這個兩個方法調(diào)用時互斥的
* @author 63176
*/
class SynchronizedDemo1{
public synchronized static void foo1(){
System.out.println("foo1被執(zhí)行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo1未執(zhí)行結(jié)束");
}
public synchronized static void foo2(){
System.out.println("foo2被執(zhí)行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo2執(zhí)行結(jié)束");
}
}
/**
* 同一對象方法調(diào)用阻塞測試
* 針對同一個對象的多線程方法調(diào)用互斥
* @author 63176
*
*/
class SynchronizedDemo2{
public synchronized void foo1(){
System.out.println("foo1被執(zhí)行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo1未執(zhí)行結(jié)束");
}
public synchronized void foo2(){
System.out.println("foo2被執(zhí)行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo2執(zhí)行結(jié)束");
}
}
/**
* 塊阻塞 -
*
* @author 63176
* synchronized this時,僅鎖定當(dāng)前對象引用;
* synchronized 類時,鎖定類,與靜態(tài)方法是互斥的
*/
class SynchronizedDemo3{
public void foo1(){
synchronized (this) {
System.out.println("foo1被執(zhí)行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo1未執(zhí)行結(jié)束");
}
}
public void foo2(){
synchronized (SynchronizedDemo3.class) {
System.out.println("foo2被執(zhí)行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo2執(zhí)行結(jié)束");
}
}
}
當(dāng)線程進(jìn)入第一個方法時,方法處理中,則其余線程訪問對應(yīng)其他方法時,需等待第一個完成;
總結(jié)
以上是生活随笔為你收集整理的java 并发测试main方法_java并发编程test之synchronized测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win11缺少dll文件怎么办?Win1
- 下一篇: 地籍宗地出图(二)