国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

解析Java線程同步鎖的選擇方法

2019-11-26 16:06:50
字體:
來源:轉載
供稿:網友

在需要線程同步的時候如何選擇合適的線程鎖?
例:選擇可以存入到常量池當中的對象,String對象等  

復制代碼 代碼如下:

public class SyncTest
{
    private String name = "name";
public void method(String flag)
    {
        synchronized (name)
        {
            System.out.println(flag + ", invoke method ....");
            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args)
    {
        SyncTest test1 = new SyncTest();

        SyncTest test2 = new SyncTest();

        MyThread1 myThread1 = new MyThread1();
        MyThread1 myThread2 = new MyThread1();
        myThread1.syncTest = test1;
        myThread2.syncTest = test1;

        MyThread1 myThread3 = new MyThread1();
        MyThread1 myThread4 = new MyThread1();
        myThread3.syncTest = test2;
        myThread4.syncTest = test2;

        myThread1.start();
        myThread2.start();
        myThread3.start();
        myThread4.start();

    }

}


線程類:
復制代碼 代碼如下:

public class MyThread1 extends Thread
{
    SyncTest syncTest;

    @Override
    public void run()
    {
        syncTest.method(this.getName());
    }
}

本來應該是要實現線程thread1和thread2同步,線程thread3和thread4同步的,但結果呢?
卻是使得線程thread1、thread2、thread3、thread4同步了,很是郁悶。
我推薦選用的同步鎖對象:
復制代碼 代碼如下:

package com.rcx.thread;

public class SyncTest
{
    // 特殊的instance變量,用于充當同步鎖的對象
    private byte[] lock = new byte[0];

    public void method(String flag)
    {
        synchronized (lock)
        {
            System.out.println(flag + ", invoke method f....");
            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args)
    {
        SyncTest test1 = new SyncTest();

        SyncTest test2 = new SyncTest();

        MyThread1 myThread1 = new MyThread1();
        MyThread1 myThread2 = new MyThread1();
        myThread1.syncTest = test1;
        myThread2.syncTest = test1;

        MyThread1 myThread3 = new MyThread1();
        MyThread1 myThread4 = new MyThread1();
        myThread3.syncTest = test2;
        myThread4.syncTest = test2;

        myThread1.start();
        myThread2.start();
        myThread3.start();
        myThread4.start();

    }

}


推薦使用0長度的byte數組充當同步鎖對象,不會產生很詫異的錯誤同時不會占用很大內存。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 许昌市| 淮北市| 黎城县| 柞水县| 嘉荫县| 阳朔县| 青神县| 二连浩特市| 辽源市| 宜都市| 盖州市| 沁源县| 勃利县| 高平市| 呈贡县| 门源| 色达县| 府谷县| 合川市| 柳江县| 深泽县| 昌吉市| 常德市| 浪卡子县| 灵宝市| 八宿县| 天祝| 监利县| 桃江县| 镇平县| 资溪县| 莆田市| 黎川县| 彭水| 金昌市| 双辽市| 海宁市| 南澳县| 福泉市| 盈江县| 松滋市|