Java线程同步锁的选择

来源:转载

 

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

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

 

分享给朋友:
您可能感兴趣的文章:
随机阅读: