Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
synchronized
#1
Здравствуйте.

PHP код:
<?php 
class Data
{
int count =0;
static
int countSt =0;
}

class
MyThread implements Runnable {

Data obj;

MyThread(Data d){
obj = d;
new
Thread(this).start();
}
void Add()
{
synchronized(Thread.class){
try {
Thread.sleep(10);
int n=obj.count;
n++;
Thread.sleep(10);
obj.count=n;
} catch (
InterruptedException ex) { }
}
}
synchronized static void AddStatic() {
try {
Thread.sleep(10);
int n=Data.countSt;
n++;
Thread.sleep(10);
Data.countSt=n;
} catch (
InterruptedException ex) { }
}
public
void run() {
for(
int i=0; i<10; i++) Add();
for(
int i=0; i<10; i++) AddStatic();
}
}

public class
Main {

public static
void main(String[] args) throws Exception {
Data d=new Data();
MyThread t1=new MyThread(d);
MyThread t2=new MyThread(d);

Thread.sleep(3000);
System.out.println(d.count);
System.out.println(Data.countSt); }

}

Выводит:
20
20

Вопрос: почему 20 20 ? А не 10?
20 раз обращаемся к переменной чтоль?
Ответ
#2
Вы же 2 потока запускаете
[src=java]MyThread t1 = new MyThread(d);
MyThread t2 = new MyThread(d);[/src]
Каждый +10 даёт
[Изображение: l2nextgen.gif]
Ответ
#3
Тьфу, ведь два потока создаем.

Спасибо большое!

Простите за мат - на имоцих был. (убрал ненормативную лексику)
Ответ
#4
если хотите увидеть разницу между static и НЕ static то поменяйте так будет видно

Код:
public class Main {

    public static void main(String[] args) throws Exception {
        Data d1=new Data();
        Data d2=new Data();

        MyThread t1=new MyThread(d1);
        MyThread t2=new MyThread(d2);

        Thread.sleep(3000);
        System.out.println(d1.count);
        System.out.println(d2.count);

        System.out.println(d1.countSt);
        System.out.println(d2.countSt);
    }
}

будет в консоли

10
10
20
20
Ответ
#5
и вообщем давно пора Executors использовать и не создавать потоки руками Smile
Кто же мы? Сколько небес сожгли...
Ответ
#6
JavaDev Написал:и вообщем давно пора Executors использовать и не создавать потоки руками Smile

Иногда нужно именно поток создать
[Изображение: l2nextgen.gif]
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 2 Гость(ей)