当我尝试通过启动不同的线程来执行所有同步方法时,我在一个类中有三个同步方法,我看不到同步输出,没有在对象上获得锁,我可以在输出中看到所有线程同时执行。下面是我的代码。赞赏输入。谢谢
公共类DisplayMessage {
public static synchronized void sayHello(String name) throws InterruptedException{
for(int i=1; i<=10;i++){
Thread.sleep(1000);
System.out.println("How are you"+name);
}
}
public synchronized void sayHello1(String name2,int j){
for(int i=1; i<=10;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("How are you Hello1 :: "+name2+ " Age " + j);
}
}
public synchronized void sayHello2(String name3,String lastname){
for(int i=1; i<=10;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("How are you Hello 2 :: "+ name3 + " lastname " +lastname);
}
}
}
线程类:
公共类MyThread扩展了线程{
String name;
MyThread(String name) {
this.name = name;
}
public void run() {
try {
DisplayMessage.sayHello(name);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Thread2类:
公共类MyThread2扩展了线程{
String name2;
String name3;
int age;
DisplayMessage dm;
MyThread2(DisplayMessage dm, String name2, int age) {
this.dm = dm;
this.name2 = name2;
this.age = age;
}
public void run() {
dm.sayHello1(name2, age);
}
}
Thread3类:
包Synchronization.classlock;
公共类MyThread3扩展了线程{
String name3;
String lastname;
int age;
DisplayMessage dm2;
MyThread3(DisplayMessage dm, String name3, String lastname) {
this.dm2 = dm;
this.name3 = name3;
this.lastname = lastname;
}
public void run() {
dm2.sayHello2(name3, lastname);
}
}
具有主方法的Democlass产生不同的线程
公共类SynchronizationDemo {
public static void main(String[] args) {
DisplayMessage dm=new DisplayMessage();
MyThread t1= new MyThread("steve");
MyThread t2=new MyThread("Anitha");
MyThread2 t3=new MyThread2(dm," Amit", 31);
MyThread3 t4=new MyThread3(dm," Arit ","urkude");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
以下是输出:
你好吗
你好你好:: Amit年龄31
你好你好:: Amit年龄31
你好吗
你好吗
你好你好:: Amit年龄31
你好吗
你好你好:: Amit年龄31
你好吗
你好你好:: Amit年龄31
你好吗
你好你好:: Amit年龄31
你好吗
你好你好:: Amit年龄31
你好你好:: Amit年龄31
你好吗
你好吗
你好你好:: Amit年龄31
你好吗
你好你好:: Amit年龄31
你好吗Anitha
你好你好2 ::阿里特姓urkude
你好吗Anitha
你好你好2 ::阿里特姓urkude
你好吗
你好你好2 ::阿里特姓urkude
你好吗
你好你好2 ::阿里特姓urkude
你好你好2 ::阿里特姓urkude
你好吗
你好吗
你好你好2 ::阿里特姓urkude
你好吗
你好你好2 ::阿里特姓urkude
你好你好2 ::阿里特姓urkude
你好吗
你好吗
你好你好2 ::阿里特姓urkude
你好吗
你好你好2 ::阿里特姓urkude
最佳答案
根据您的代码,您看到的输出完全有效。 MyThread
使用的是DisplayMessage.sayHello()
方法,该方法是static
,因此在DisplayMessage.class
对象上同步。 synchronized
方法中static
关键字的用法等效于:
public static void sayHello(String name) throws InterruptedException{
synchronized(DisplayMessage.class) {
for(int i=1; i<=10;i++){
Thread.sleep(1000);
System.out.println("How are you"+name);
}
}
}
另一方面,另外两个线程
MyThread2
和MyThread3
调用非静态方法-sayHello1
和sayHello2
,它们在this
上同步。在这种情况下,synchronized
关键字的用法等效于:public void sayHello1(String name2,int j){
synchronized(DisplayMessage.this) {
for(int i=1; i<=10;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("How are you Hello1 :: "+name2+ " Age " + j);
}
}
}
因此,您的输出包含并发运行的
steve
和Amit
,然后是并发运行的Anitha
和Arit
,这是预期的,因为代码在两个不同的对象上同步。关于java - 在多线程中同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43865454/