解析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数组充当同步锁对象,不会产生很诧异的错误同时不会占用很大内存。
推荐阅读
-
解析Java线程同步锁的选择方法
-
深入解析Python中的线程同步方法
-
深入解析Python中的线程同步方法
-
Java编程线程同步工具Exchanger的使用实例解析
-
Java编程线程同步工具Exchanger的使用实例解析
-
荐 Java中多线程的使用(超级超级详细)线程安全+线程锁原理解析+保证线程安全的三种方式 (同步代码块+同步方法+lock锁) 5
-
Java 多线程同步问题的探究(二、给我一把锁,我能创造一个规矩)
-
Java~使用synchronized修饰静态方法带来的问题 与 同步synchronized代码块不使用String作为锁对象的原因
-
关于JAVA中多线程编程方法的详细解析(附实例)
-
Java多线程同步几种的方法介绍