使用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; 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)