要想解決
public synchronized void run()
{
}
從上面的代碼可以看出
sychronized關鍵字只和一個對象實例綁定
class Test
{
public synchronized void method()
{
}
}
public class Sync implements Runnable
{
private Test test;
public void run()
{
thod();
}
public Sync(Test test)
{
this
}
public static void main(String[] args) throws Exception
{
Test test
Test test
Sync sync
Sync sync
new Thread(sync
new Thread(sync
}
}
在Test類中的method方法是同步的
Sync sync
不僅可以使用synchronized來同步非靜態方法
class Test
{
public static synchronized void method() { }
}
建立Test類的對象實例如下
Test test = new Test();
對於靜態方法來說
在
package test;
// 線程安全的Singleton模式
class Singleton
{
private static Singleton sample;
private Singleton()
{
}
public static Singleton getInstance()
{
if (sample == null)
{
Thread
sample = new Singleton();
}
return sample;
}
}
public class MyThread extends Thread
{
public void run()
{
Singleton singleton = Singleton
System
}
public static void main(String[] args)
{
Thread threads[] = new Thread[
for (int i =
threads[i] = new MyThread();
for (int i =
threads[i]
}
}
在上面的代碼調用yield方法是為了使單件模式的線程不安全性表現出來
程序的運行結果如下
上面的運行結果可能在不同的運行環境上有所有同
要想使上面的單件模式變成線程安全的
public static synchronized Singleton getInstance() { }
當然
private static final Singleton sample = new Singleton();
然後在getInstance方法中直接將sample返回即可
在使用synchronized關鍵字時有以下四點需要注意
雖然可以使用synchronized來定義方法
在子類方法中加上synchronized關鍵字
class Parent
{
public synchronized void method() { }
}
class Child extends Parent
{
public synchronized void method() { }
}
在子類方法中調用父類的同步方法
class Parent
{
public synchronized void method() { }
}
class Child extends Parent
{
public void method() { thod(); }
}
在前面的例子中使用都是將synchronized關鍵字放在方法的返回類型前面
public synchronized void method();
synchronized public void method();
public static synchronized void method();
public synchronized static void method();
synchronized public static void method();
但要注意
public void synchronized method();
public static void synchronized method();
synchronized關鍵字只能用來同步方法
public synchronized int n =
public static synchronized int n =
雖然使用synchronized關鍵字同步方法是最安全的同步方式
package test;
public class MyThread
{
public String methodName;
public static void method(String s)
{
System
while (true)
;
}
public synchronized void method
{
method(
}
public synchronized void method
{
method(
}
public static synchronized void method
{
method(
}
public static synchronized void method
{
method(
}
public void run()
{
try
{
getClass()
}
catch (Exception e)
{
}
}
public static void main(String[] args) throws Exception
{
MyThread
for (int i =
{
thodName =
new Thread(myThread
sleep(
}
}
}
運行結果如下
非靜態的method
靜態的method
從上面的運行結果可以看出
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27526.html