جاواپرو | برنامه نویسی جاوا | Java
5.86K subscribers
1.15K photos
158 videos
381 files
1.28K links
🎓آکـــــــــادمی جاواپـــــــــــــــرو
آموزش پیش نیازهای برنامه نویسی
آموزش مقدماتی تا پیشرفته جاوا
آموزش Spring Boot
سفارش پروژه ، دوره و تدریس خصوصی: @rzutab
مشاهده دوره ها و ثبت نام👇
wwww.academyjavapro.com
گروه جاوا : @group_javapro
Download Telegram
📌دوره فریمورک Spring Boot

در قالب ساخت برنامه کتاب فروشی مباحث پایه ای Spring Boot آموزش می دهد.

با این دوره حتی می تونید یک سایت کوچیک با اسپرینگ بوت بالا بیارید.

یکی از محبوب ترین دوره های جاواپرو


👇👇👇👇👇👇👇

مشاهده سرفصل ها و ثبت نام
📌دوره پروژه محور اسپرینگ بوت (Spring Boot) – سیستم دانشگاه


این دوره برای افرادی است که با Spring Boot آشنایی دارند و حالا میخوان اندوخته های خودشون رو در یک پروژه عملی اجرا کنند.


🔥🔥🔥🔥🔥🔥
ثبت نام
📌دوره دژبان Spring Security

از موضوعات مهم Spring که باید در آن مهارت داشته باشیم. برای نوشتن برنامه های با امنیت بالا به این دوره نیاز داریم.

ثبت نام
📌دوره طلایی Spring Core


احتمالا از منابع زیادی سعی کردید Spring Boot رو یاد بگیرید. ولی عموما فکر میکنید اکثرا خیلی خوب آموزش ندادن. دلیلش هم این هست که برای یادگیری Spring Boot اونها فرض میکنن شما یکسری مفاهیم رو بلد هستید. بخاطر همین توضیح نمیدن.
برای یادگیری Spring Boot شما بایستی حداقل موارد زیر رو بدونید:
Database
JDBC
JPA
Junit
Mockito
Spring context
Spring Data JPA
Dependency Injection

که ما موارد بالا رو در دوره Spring Core برای شما قرار دادیم تا با پایه ای قوی وارد Spring boot بشید.

در عین حال نگاه کاملا جامعی به Database داشتیم که یکی از پرقدرت ترین DBMS ها رو آموزش داده ایم. (SQL Server).
درواقع با گذراندن دوره Spring Core آکادمی جاواپرو میتوانید خاطر جمع باشید که تمام موارد بالا رو یاد گرفتید و حتما کوئری نویس ماهری هم شدید!


ثبت نام
📌دوره جامع نخبگان معماری میکروسرویس‌ها با Java و Spring Boot

تصور کن در یک مصاحبه کاری برای شرکت آلمانی یا کانادایی نشسته‌ای. مصاحبه‌گر ازت می‌پرسه: «آیا تا حالا با معماری میکروسرویس کار کردی؟»
اینجاست که تو با اعتماد به نفس لبخند می‌زنی و نه‌تنها می‌گی «بله»، بلکه پروژه‌ای واقعی برای نشون دادن داری.
این دوره فقط یک کلاس نیست، فرصتیه برای ساختن آینده‌ای که همیشه می‌خواستی؛ چه در داخل ایران و چه در شرکت‌های خارجی.
اگه می‌خوای از یک برنامه‌نویس معمولی به یک توسعه‌دهنده‌ی حرفه‌ای با پتانسیل مهاجرت تبدیل بشی، این دوره برای تو طراحی شده.


✳️فقط با پیش نیاز Java Core می توانید در این دوره شرکت کنید.

✳️ضمانت بازگشت وجه دارد

✳️پشتیبانی تلگرامی توسط شخص مدرس دارد

مباحث حرفه ای و سازمانی جاوا رو اکثرا کسانی مسلط هستند که در شرکت های مرتبط شاغل هستند و بخاطر پروژه های زیادی که در دست دارند وقت و فرصت تدریس و آموزش را ندارند و حتی از نظر مالی براشون جذابیت نداره به همین خاطر این دسته آموزش ها در ایران کم است، مثلا برای همین دوره بیش از یک سال پیگیری و انتظار تا موفق شدیم استاد دوره را راضی کنیم که برای ارتقای فنی برنامه نویسان جاوا در ایران این دوره را تهیه کنند.

مباحثی در این دوره بررسی شده که حتی یودمی هم به آن نپرداخته است


ثبت نام
جاواپرو | برنامه نویسی جاوا | Java pinned «✳️اگر میخواید Java Core یاد بگیری👇 دوره پرتاب دوره مقدماتی جاوا دوره شاهکار پیشرفته جاوا ✳️دوره های مرتبط با Spring 👇 دوره طلایی Spring Core دوره فریمورک Spring Boot-کتاب فروشی آنلاین دوره پروژه محور Spring Boot-سیستم دانشگاه دوره Spring Security ✳️معماری…»
آیا دوره‌های جاوا،Spring,Microservices آکادمی جاواپرو برای استخدام شدن مناسب هستند؟

بله، یادگیری اصولی جاوا و ابزارهای مرتبط، یکی از مهم‌ترین پیش‌نیازهای ورود به بازار کار برنامه‌نویسی است. اما باید واقع‌بین بود: هیچ دوره‌ای به‌تنهایی تضمین‌کننده استخدام نیست.
شما برای ورود به یک شرکت برنامه‌نویسی باید در مصاحبه فنی شرکت کنید و مهارت‌های واقعی خود را نشان دهید—از جمله توانایی حل مسئله، آشنایی با ساختارها، پروژه‌هایی که انجام داده‌اید و نحوه نوشتن کد تمیز.

دوره‌های جاواپرو به‌عنوان یک مسیر یادگیری استاندارد، شرط لازم برای ساختن مهارت‌های مورد نیاز بازار کار هستند.
محتوا از مقدماتی تا پیشرفته طراحی شده و شما را از مفاهیم پایه تا کار با فریم‌ورک‌هایی مثل Spring Boot پیش می‌برد. علاوه بر این، تمامی مدرسین جاواپرو در شرکت‌های فعال و مرتبط با حوزه جاوا شاغل هستند و تجربه عملی آن‌ها در دوره‌ها منعکس شده است.

با این حال، برای اینکه آماده استخدام شوید، لازم است علاوه بر گذراندن دوره‌ها:

پروژه واقعی بسازید

گیت‌هاب فعال داشته باشید

رزومه قابل ارائه آماده کنید

و کمی تجربه کار تیمی یا تمرین‌های مشابه شرکت‌ها کسب کنید

اگر این موارد را همراه با دوره‌های جاواپرو پیش ببرید، شانس شما برای استخدام به‌صورت چشمگیری افزایش پیدا می‌کند.

📚لیست دوره های تخصصی مرتبط با جاوا
بعضی از عزیزان پیام دادن آیا جاوا آینده شغلی در ایران داره؟
نمونه آگهی های استخدام جاوا در جابینجا و جاب ویژن رو می تونید مشاهده نمایید.
خارج از کشور هم دیگه بدون توضیح است که چقدر به این تخصص نیاز است.

کد تخفیف 40%: ABAN
فقط تا امشب فرصت است.

📚لیست دوره های تخصصی مرتبط با جاوا
🧠 آشنایی با ابزارهای java.util.concurrent برای مدیریت Reordering و Visibility

در برنامه‌نویسی همزمانی در جاوا، یکی از چالش‌های اصلی، کنترل ترتیب اجرای عملیات و اطمینان از قابل‌مشاهده بودن تغییرات حافظه میان Threadها است. برای حل این مشکلات، زبان جاوا مجموعه‌ای از ابزارهای قدرتمند در پکیج java.util.concurrent ارائه می‌دهد که به‌طور مستقیم برای مدیریت هماهنگی، همگام‌سازی و جلوگیری از مشکلات حافظه طراحی شده‌اند. سه ابزار مهم در این زمینه CountDownLatch، CyclicBarrier و AtomicInteger هستند.


✳️ ۱. CountDownLatch — ابزار انتظار تا تکمیل عملیات

در بسیاری از شرایط، لازم است یک Thread صبر کند تا چند Thread دیگر کار خود را کامل کنند. در چنین مواقعی، CountDownLatch به کمک می‌آید.

هنگامی که Latch مقدار شمارش اولیه دارد، هر بار که یک Thread عملیات خود را تمام می‌کند، مقدار آن یک واحد کاهش می‌یابد. زمانی که مقدار به صفر برسد، همه‌ی Threadهایی که منتظر بودند اجازه‌ی ادامهٔ کار پیدا می‌کنند.

🔹 مزیت در بحث Reordering و Visibility:
CountDownLatch تضمین می‌کند که هر تغییری که قبل از کاهش شمارنده انجام شده، توسط Threadهای منتظر به‌درستی دیده می‌شود. این رفتار مطابق با *Happens-Before Relation* است.

🔹 مثال:


CountDownLatch latch = new CountDownLatch(2);
AtomicInteger result = new AtomicInteger(0);

new Thread(() -> {
result.addAndGet(10);
latch.countDown();
}).start();

new Thread(() -> {
result.addAndGet(20);
latch.countDown();
}).start();

// Thread اصلی
latch.await();
System.out.println(result.get());


در این مثال، عملیات روی result همیشه قبل از ادامه یافتن Thread اصلی اتفاق می‌افتد.


✳️ ۲. CyclicBarrier — هماهنگی میان چند Thread

در کاربردهایی مانند شبیه‌سازی یا پردازش موازی، لازم است چند Thread به یک نقطه‌ی مشترک برسند و سپس همزمان ادامه دهند. CyclicBarrier دقیقاً برای این هدف طراحی شده است.

وقتی چند Thread به مانع (Barrier) برسند، همه تا زمان تکمیل تعداد مشخص‌شده صبر می‌کنند و سپس با هم ادامه می‌دهند. این ابزار در سناریوهایی مفید است که لازم است مراحل پردازش چند Thread هماهنگ انجام شود.

🔹 مزیت در بحث Visibility:
هنگامی که همه‌ی Threadها به مانع می‌رسند، مقادیر مشترک در حافظه قبل از عبور از Barrier برای همه قابل مشاهده خواهند بود، زیرا Barrier یک نقطه‌ی همگام‌سازی ایجاد می‌کند.

🔹 مثال:


CyclicBarrier barrier = new CyclicBarrier(3, () -> {
System.out.println("All threads reached the barrier!");
});

Runnable task = () -> {
System.out.println(Thread.currentThread().getName() + " working...");
try {
barrier.await();
} catch (Exception e) {}
};

new Thread(task).start();
new Thread(task).start();
new Thread(task).start();


در این نمونه، هر سه Thread تا رسیدن همه به نقطه‌ی مشترک منتظر می‌مانند.


✳️ ۳. AtomicInteger — متغیر امن در برابر Race Condition

در شرایطی که چند Thread یک متغیر مشترک را تغییر می‌دهند، استفاده از متغیرهای معمولی باعث Race Condition و رفتار غیرقابل پیش‌بینی می‌شود. کلاس AtomicInteger عملیاتی مثل افزایش و کاهش را به صورت اتمی (Atomic) انجام می‌دهد. این یعنی عملیات به‌صورت کامل و غیرقابل تقسیم اجرا می‌شود و هیچ Thread دیگری نمی‌تواند در میانه‌ی عملیات آن را مختل کند.

🔹 مزیت در بحث Reordering:
عملیات Atomic با استفاده از دستورهای سطح پایین CPU (مانند CAS) اجرا می‌شوند که اجازه‌ی Reorder ناامن را نمی‌دهند.

🔹 مزیت در بحث Visibility:
AtomicInteger تضمین می‌کند که تغییرات بلافاصله برای تمام Threadها قابل مشاهده است.

🔹 مثال:


AtomicInteger counter = new AtomicInteger(0);

Runnable task = () -> {
for (int i = 0; i < 1000; i++) {
counter.incrementAndGet();
}
};

Thread t1 = new Thread(task);
Thread t2 = new Thread(task);

t1.start();
t2.start();

t1.join();
t2.join();

System.out.println(counter.get());


در این مثال، مقدار نهایی همیشه ۲۰۰۰ خواهد بود، بدون هیچ‌گونه Race Condition.
👍3
🧠 ۴. نتیجه‌گیری

ابزارهای موجود در java.util.concurrent نقش بسیار مهمی در مدیریت همزمانی و جلوگیری از رفتارهای غیرمنتظره حافظه دارند.

CountDownLatch
به کنترل ترتیب اجرای Threadها کمک می‌کند.
CyclicBarrier
امکان همگام‌سازی مرحله‌ای بین Threadها را فراهم می‌کند.
AtomicInteger
امنیت و قابل‌مشاهده بودن تغییرات متغیرها را تضمین می‌کند.

درک صحیح این ابزارها باعث می‌شود برنامه‌های چندریسمانی پایدارتر، ایمن‌تر و پیش‌بینی‌پذیرتری نوشته شود.

#کاربرـحرفهـای


🆔 @javapro_ir
🆔 @group_javapro
👍3
📘 آشنایی با Semaphore، Exchanger و Phaser در همزمانی (Concurrency)

در برنامه‌نویسی همزمانی در جاوا، گاهی تنها هماهنگ‌سازی ساده میان Threadها کافی نیست و نیاز داریم رفتارهای پیچیده‌تری مانند کنترل ظرفیت، تبادل داده بین Threadها یا هماهنگی مرحله‌ای ایجاد کنیم. سه ابزار Semaphore، Exchanger و Phaser برای این اهداف طراحی شده‌اند و بخش مهمی از کتابخانهٔ java.util.concurrent را تشکیل می‌دهند. این ابزارها کنترل پیشرفته‌تری بر رفتار Threadها ارائه می‌دهند.


✳️ ۱. Semaphore — کنترل دسترسی به منابع محدود

در بسیاری از برنامه‌ها، تعداد منابع محدود است؛ مانند کانکشن‌های پایگاه داده، تعداد خاصی از فایل‌ها، یا دسترسی همزمان به یک دستگاه سخت‌افزاری. Semaphore این امکان را فراهم می‌کند که فقط تعداد مشخصی از Threadها اجازهٔ ورود داشته باشند.

هنگامی که یک Thread از Semaphore اجازه می‌گیرد (acquire)، یکی از مجوزها مصرف می‌شود. زمان بازگرداندن مجوز (release)، ظرفیت دوباره آزاد می‌شود. این ساختار شبیه یک «دروازه با ظرفیت محدود» عمل می‌کند.

🔹 مثال:

Semaphore semaphore = new Semaphore(2); // فقط ۲ Thread همزمان

Runnable task = () -> {
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + " entered");
Thread.sleep(1000);
semaphore.release();
} catch (Exception ignored) {}
};

new Thread(task).start();
new Thread(task).start();
new Thread(task).start();


در این مثال، فقط دو Thread همزمان اجازه ورود دارند و Thread سوم منتظر می‌ماند.


✳️ ۲. Exchanger — تبادل داده بین دو Thread

گاهی دو Thread نیاز دارند داده‌های خود را با یکدیگر رد و بدل کنند؛ برای مثال یکی داده‌ای پردازش می‌کند و Thread دیگر نتیجه را بررسی می‌کند. کلاس Exchanger مکانیزمی فراهم می‌کند که دقیقاً دو Thread بتوانند داده‌های خود را با هم تبادل کنند.

Thread اول تا زمانی که Thread دوم به نقطهٔ تبادل نرسد منتظر می‌ماند و سپس داده‌ها مبادله می‌شوند.

🔹 مثال:

Exchanger<String> exchanger = new Exchanger<>();

new Thread(() -> {
try {
String result = exchanger.exchange("Data from Thread 1");
System.out.println("Thread 1 received: " + result);
} catch (Exception ignored) {}
}).start();

new Thread(() -> {
try {
String result = exchanger.exchange("Data from Thread 2");
System.out.println("Thread 2 received: " + result);
} catch (Exception ignored) {}
}).start();


در این نمونه، دو Thread پیام‌های خود را با یکدیگر جابجا می‌کنند.


✳️ ۳. Phaser — کنترل هماهنگی مرحله‌ای (Multi-Phase Synchronization)

وقتی یک عملیات از چند مرحله تشکیل شده و چند Thread باید هر مرحله را همزمان انجام دهند، Phaser ابزار مناسب این نوع هماهنگی است. این کلاس نسخهٔ پیشرفته‌تر CyclicBarrier محسوب می‌شود و امکانات بیشتری برای کنترل تعداد متغیر Threadها در طول برنامه فراهم می‌کند.

Phaser می‌تواند در هر مرحله همهٔ Threadها را متوقف کند تا زمانی که همه به پایان مرحله برسند. سپس مرحله بعدی آغاز می‌شود.

🔹 مثال:

Phaser phaser = new Phaser(3); // سه Thread ثبت شده‌اند

Runnable task = () -> {
System.out.println(Thread.currentThread().getName() + " Phase 1");
phaser.arriveAndAwaitAdvance();

System.out.println(Thread.currentThread().getName() + " Phase 2");
phaser.arriveAndAwaitAdvance();

System.out.println(Thread.currentThread().getName() + " Phase 3");
phaser.arriveAndDeregister();
};

new Thread(task).start();
new Thread(task).start();
new Thread(task).start();


در این نمونه، هر سه Thread باید مرحلهٔ ۱ را تمام کنند تا مرحلهٔ ۲ شروع شود و همین‌طور برای مراحل بعدی.


🧠 ۴. جمع‌بندی

ابزارهای معرفی‌شده نقش مهمی در ساخت برنامه‌های همزمانی پایدار و قابل‌کنترل دارند:

*در Semaphore تعداد Threadهای مجاز برای دسترسی به یک منبع را کنترل می‌کند.
Exchanger امکان تبادل دادهٔ مطمئن و هماهنگ بین دو Thread را فراهم می‌کند.
Phaser هماهنگی مرحله‌ای میان مجموعه‌ای از Threadهای متغیر را مدیریت می‌کند.

درک این ابزارها باعث می‌شود برنامه‌های چندریسمانی حرفه‌ای‌تر و قابل‌پیش‌بینی‌تری نوشته شود.

#کاربرـحرفهـای



📚لیست دوره های تخصصی مرتبط با جاوا

🆔 @javapro_ir
🆔 @group_javapro
👍5
🔥 مقایسه HashMap ،Hashtable و LinkedHashMap
جاواپرو | برنامه نویسی جاوا | Java
🔥 مقایسه HashMap ،Hashtable و LinkedHashMap
🔥 مقایسه HashMap ،Hashtable و LinkedHashMap

در جاوا، انتخاب پیاده‌سازی درست برای Map می‌تواند تأثیر زیادی روی کارایی، Thread-Safety و حفظ ترتیب در برنامه شما داشته باشد. در ادامه یک جمع‌بندی سریع و کاربردی برای انتخاب بهتر آورده شده است 👇

🟦ر ۱️⃣ HashMap – سریع و انعطاف‌پذیر

بهترین انتخاب در اکثر سناریوها که سرعت مهم است.

از کلید و مقدار null پشتیبانی می‌کند

غیر Thread-Safe → سرعت بیشتر

🔄 ترتیب درج را حفظ نمی‌کند

🎯 مناسب زمانی که سرعت مهم است و نیازی به حفظ ترتیب ندارید

🟩 ۲️⃣ ر Hashtable – Thread-Safe اما قدیمی

قدیمی‌ترین پیاده‌سازی Map در جاوا.

از null برای کلید یا مقدار پشتیبانی نمی‌کند

🔐 همه عملیات‌ها Synchronized → Thread-Safe اما کند

🔄 ترتیب مشخصی ندارد

⚠️ به‌جای آن از ConcurrentHashMap استفاده کنید


🟨ر ۳️⃣ LinkedHashMap – نسخه‌ی مرتب HashMap

ترکیبی از سرعت HashMap + قابلیت حفظ ترتیب.

ترتیب درج را حفظ می‌کند

از null key/value پشتیبانی می‌کند

غیر Thread-Safe

🎯 عالی برای کش‌ها، Mapهای مرتب

(از access-order پشتیبانی می‌کند → مناسب برای ساخت LRU Cache)


🧠 چه زمانی کدام را انتخاب کنیم؟

نیاز انتخاب مناسب

جستجوی سریع بدون نیاز به ترتیب HashMap
ر Map ایمن در برابر Thread ConcurrentHashMap (نه Hashtable)
حفظ ترتیب درج داده‌ها LinkedHashMap
ساخت LRU Cache LinkedHashMap با access-order

👉 همیشه از Hashtable در جاوای مدرن دوری کنید.
👉 برای اکثر کارها HashMap یا LinkedHashMap بهترین انتخاب‌اند.
👉 برای برنامه‌های چندریسمانی از ConcurrentHashMap استفاده کنید.

در دوره زیر Collection ها در جاوا به صورت مفصل بهش پرداخته شده است👇

مشاهده دوره[کلیک کنید]


🆔 @javapro_ir
🆔 @group_javapro
جلسه ۲۳ تهران جاگ

زمان: پنج شنبه ۲۹ آبان ۱۴۰۴ ساعت ۰۹:۰۰ الی ۱۴:۰۰

مکان: ملاصدرا، خیابان عباس شیرازی شمالی، خیابان حکیم اعظم، پلاک ۳۰، دانشگاه خاتم، همکف، سالن آمفی تأتر

لینک ثبت نام: https://evand.com/events/tehjug23


موضوع جلسه:
An Analysis of The Latest and Most Impactful JEPs Proposed in JDK 25.