解析Java线程同步锁的选择方法

时间:2021-05-19

在需要线程同步的时候如何选择合适的线程锁?
例:选择可以存入到常量池当中的对象,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数组充当同步锁对象,不会产生很诧异的错误同时不会占用很大内存。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章