方法同步:
使用synchronized使得对象中的方法被加锁,只能被一个对象调用完之后才能被另一个对象调用。
public class App implements Runnable
{
public static void main( String[] args )
{
Counter counter =new Counter();
Thread thread1 =new Thread(counter,"线程一");
Thread thread2 = new Thread(counter,"线程二");
thread1.start();
thread2.start();
}
}
class Counter implements Runnable{
int i=0;
synchronized void show() {
for (; i <=3; i++) {
System.out.println(Thread.currentThread().getName() + i);
}
i=0;
}
public void run() {
// TODO Auto-generated method stub
show();
}
}
线程二0
线程二1
线程二2
线程二3
线程一0
线程一1
线程一2
线程一3
块同步:
当两个线程并发的访问一个对象的中的Synchronized(this)同步代码块时,一段时间只能由一个线程得到执行
package test.demo;
import java.io.Console;
import java.rmi.server.UID;
import java.util.concurrent.ThreadFactory;
/**
* Hello world!
*
*/
public class App implements Runnable
{
Service service;
public App(Service service) {
// TODO Auto-generated constructor stub
super();
this.service = service;
}
public static void main( String[] args )
{
Service service = new Service();
App app = new App(service);
Thread thread1 =new Thread(app,"线程一");
Thread thread2 = new Thread(app,"线程二");
thread1.start();
thread2.start();
//两进程同时运行Service的serviceMethod()方法
}
public void run() {
// TODO Auto-generated method stub
service.serviceMethod();
}
}
class Service{
void serviceMethod() {
try {
synchronized (this) {//加入块同步锁,使得该语句块被某一个线程加锁,该线程执行完其他线程才能执行
System.out.println(Thread.currentThread().getName()+"begin time ="+System.currentTimeMillis());
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"end time ="+System.currentTimeMillis());
}
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
线程一begin time =1635665200259
线程一end time =1635665201271
线程二begin time =1635665201271
线程二end time =1635665202284