解析Java线程同步锁的选择方法_Java教程-查字典教程网
解析Java线程同步锁的选择方法
解析Java线程同步锁的选择方法
发布时间:2016-12-28 来源:查字典编辑
摘要:在需要线程同步的时候如何选择合适的线程锁?例:选择可以存入到常量池当中的对象,String对象等复制代码代码如下:publicclassSy...

在需要线程同步的时候如何选择合适的线程锁?

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

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新Java学习
    热门Java学习
    编程开发子分类