通过synchronized块来同步特定的静态或非静态方法。
要想实现这种需求必须为这些特性的方法定义一个类变量,然后将这些方法的代码用synchronized块括起来,并将这个类变量作为参数传入synchronized块
下面的代码演示了如何同步特定的类方法:
public class SyncThread extends Thread
{
private static String sync = "";
private String methodType = "";
public SyncThread(String methodType)
{
this.methodType = methodType;
}
private static void method(String s)
{
synchronized (sync)
{
sync = s;
System.out.println(s);
while (true);
}
}
public void method1()
{
method("method1");
}
public static void staticMethod1()
{
method("staticMethod1");
}
public void run()
{
if (methodType.equals("static"))
staticMethod1();
else if (methodType.equals("nonstatic"))
method1();
}
public static void main(String[] args) throws Exception
{
SyncThread sample1 = new SyncThread("nonstatic");
SyncThread sample2 = new SyncThread("static");
sample1.start();
sample2.start();
}
}
String s = "hello";
System.out.println(s.hashCode());
s = "world";
System.out.println(s.hashCode());
注意:在使用synchronized块时应注意,synchronized块只能使用对象作为它的参数。如果是简单类型的变量(如int、char、boolean等),不能使用synchronized来同步.
我发现synchronized 是属于线程间的同步锁, 对main主线程起不了任何约束,当一个线程对某个对象启用了synchronized , 其它线程将进入等待, 及无法操作此对象, main函数却不需要等待,可以直接进行操作