如果线程需要共享数据怎么办?
synchronized(对象)
{
需要同步的代码
}
气死我了上代码:
package tread;
class Test implements Runnable
{ int t = 20;
Object a=new Object();
public void run() {
while(true) {
synchronized(a)
{
if(t>0) {
try {Thread.sleep(10);}
catch(Exception e){
}
System.out.println("数字为"+t--);
}
}
}
}
}
public class acsad
{
public static void main(String[] args) {
Test t=new Test();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
部分输出为:
数字为20
数字为19
数字为18
数字为17
...
数字为3
数字为2
数字为1
第二种同步的方法(某个函数内同步)
package tread;
class Test implements Runnable
{ int t = 20;
public void run() {
while(true) {
{
show();
}
}
}
public synchronized void show() {
if(t>0) {
System.out.println("数字为"+t--);
}
}
}
public class acsad
{
public static void main(String[] args) {
Test t=new Test();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
输出:
数字为20
数字为19
数字为18
数字为17
。。。
数字为1
这里为什么要额外建一个函数呢?
为了同步的代码只是需要的代码。
如果t是静态的那该这个程序会 不能运行,咱们怎么能让他运行呢?
上代码:
package tread;
class Test implements Runnable
{ static int t = 20;
public void run() {
while(true) {
{ synchronized(Test.class) { //在这里换成 类名.class
if(t>0) {
System.out.println("数字为"+t--);
}
}
}
}
}
}
public class acsad
{
public static void main(String[] args) {
Test t=new Test();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
输出:
数字为20
数字为19
数字为18
数字为17
。。。
数字为1
为什么这么做呢,正常的情况,静态的同步方法使用的方法是该方法所在类的字节码文件对象。(类名.class)