synchronized:
1.多線程執行同一對象的synchronized函數,線程同步正確;
實例代碼如下:
public class Test1 implements Runnable{
//定義同一對象
static Test2 action;
public static void main(String[] args) {
// TODO Auto-generated method stub
Class cls;
try {
cls = Class.forName("Test2");
action = (Test2) cls.newInstance();
Test1 t1 = new Test1();
for (int i=0;i<1;i++){
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run() {
// TODO Auto-generated method stub
try {
action.getRandomString();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Test2 {
public static void main(String[] args) {
}
//調用同一對象的synchronized 函數,無需加statci修飾
public synchronized void getRandomString() throws InterruptedException {
System.out.println("$$$$$$$$$$$$$$$$$$");
Thread.sleep(1000);
Random random = new Random();
int aa = random.nextInt(10);
int bb = random.nextInt(10);
int cc = random.nextInt(10);
System.out.println(String.valueOf(aa)+String.valueOf(bb)+String.valueOf(cc));
System.out.println("############");
}
}
=====================================================
=====================================================
2.多線程執行不同對象的synchronized函數,線程同步錯誤;
實例代碼如下:
public class Test1 implements Runnable{
public static void main(String[] args) {
try {
Test1 t1 = new Test1();
for (int i=0;i<100;i++){
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run() {
// TODO Auto-generated method stub
Class cls;
try {
cls = Class.forName("Test2");
Test2 action = (Test2) cls.newInstance();
action.getRandomString();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Test2 {
public static void main(String[] args) {
}
/**
* @param args
* @throws InterruptedException
*/
//調用不同對象的synchronized 函數,需要加statci修飾,否則線程同步失敗
public synchronized void getRandomString() throws InterruptedException {
System.out.println("$$$$$$$$$$$$$$$$$$");
Thread.sleep(1000);
Random random = new Random();
int aa = random.nextInt(10);
int bb = random.nextInt(10);
int cc = random.nextInt(10);
System.out.println(String.valueOf(aa)+String.valueOf(bb)+String.valueOf(cc));
System.out.println("############");
}
}
====================================================
=====================================================
3.多線程執行不同對象的synchronized static 函數,線程同步正確;
實例代碼如下:
public class Test1 implements Runnable{
public static void main(String[] args) {
try {
Test1 t1 = new Test1();
for (int i=0;i<100;i++){
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run() {
// TODO Auto-generated method stub
Class cls;
try {
cls = Class.forName("Test2");
Test2 action = (Test2) cls.newInstance();
action.getRandomString();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Test2 {
public static void main(String[] args) {
}
/**
* @param args
* @throws InterruptedException
*/
//調用不同對象的synchronized 函數,需要加statci修飾,否則線程同步失敗
public synchronized static void getRandomString() throws InterruptedException {
System.out.println("$$$$$$$$$$$$$$$$$$");
Thread.sleep(1000);
Random random = new Random();
int aa = random.nextInt(10);
int bb = random.nextInt(10);
int cc = random.nextInt(10);
System.out.println(String.valueOf(aa)+String.valueOf(bb)+String.valueOf(cc));
System.out.println("############");
}
}
=========================================================
==========================================================