一、
public class MyThread implements Runnable {
int ticket=10;
/**
* 如果是兩個都是str堆引用的話,進入同步塊之後改變值,還是異步
*/
String str="abc";
public void run() {
synchronized(str){
str="sss";
while(ticket>0){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-----"+ticket--);
}
}
}
public static void main(String[] args) {
MyThread t1=new MyThread();
new Thread(t1,"aa").start();
new Thread(t1,"bb").start();
}
}
二。
<pre name="code" class="java">public class MyThread implements Runnable {
int ticket=10;
/**
* 如果是兩個都是str堆引用的話,進入同步塊之後改變值,還是異步,不同的鎖
*/
/**
* 如果是靜態。只會在第一次加載類的時候初始化,所以不管下面new幾個Mythread實例,都還是同步的,同一把鎖
*/
static String str="abc";
public void run() {
synchronized(str){
while(ticket>0){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-----"+ticket--);
}
}
}
public static void main(String[] args) {
MyThread t1=new MyThread();
new Thread(t1,"aa").start();
new Thread(new MyThread(),"bb").start();
}
}